结论:
虚析构的作用是避免在delete基类指针时,没有执行派生的析构函数从而导致内存泄漏的问题。
验证:
没有加virtual关键字的代码示例:
class A
{
public:
~A()
{
cout << "this is ~A()" << endl;
}
};
class B:public A
{
public:
~B()
{
cout << "this is ~B()" << endl;
}
};
int main()
{
A *a = new B();
delete a;
system("pause");
return 0;
}
执行结果:
发现虽然A类的指针指向了B类,但是在析构时,并没有走B的析构函数,此时发生了内存泄漏。
加上virtual之后:
class A
{
public:
virtual ~A()
{
cout << "this is ~A()" << endl;
}
};
执行结果:
先执行的是B的析构,然后是A的析构,此时开辟的堆内存正确释放。
Tips:
因此在使用多态时,顺便的为基类的析构函数加上virtual是个好习惯✔。
PS:如想学习C++的基础知识或者需要适合初学者的Demo可以直接访问我的代码仓库:点此跳转 (您的star🧡或者issues就是对我最大的鼓励)