在虚函数的定义与要求中,仅允许析构函数设置虚函数(构造函数不允许),且虚析构函数的函数名必须与当前的类名保持一致,无法与基类中虚函数名一致,是虚函数中的特例;
析构函数作用于对象生命周期结束后,清理动态创建的内存等,以防止出现内存泄漏的问题。一个对象调用了构造函数,则配对在结束时调用析构函数,否则可能出现严重事故
问题代码设计列举:
class A
{
public:
int* m_a;
A(int a)
{
if (a <= 0) a = 1;
m_a = new int[a];
cout << "A 的构造函数" << endl;
}
~A()
{
delete[]m_a;
m_a = nullptr;
cout << "~ A " << endl;
}
};
class B :public A
{
public:
int* m_b;
B(int b,int a):A(a)
{
if (b <= 0) b = 1;
m_b = new int[b];
cout << "B 的构造函数" << endl;
};
~B()
{
delete[]m_b;
m_b = nullptr;
cout << "~ B " << endl;
}
};
int main()
{
A *a =new B(2,3);
delete a;
};
该函数执行结束后,依然未调用B类对象的析构函数,导致内存泄漏
修改:仅需将基类析构函数改为虚析构函数virtual
将原11行代码修改为:
virtual ~A()
虚函数由继承的特性使得派生类的析构函数均为虚析构函数,达成动态多态功能实现全部动态内存均被清理释放。
总结:
将基类的析构函数定义为虚析构函数,派生类继承虚析构函数!避免内存泄漏