话不多说,直接上代码:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class A
{
public:
A()
{
p = new char[10];
strcpy(p,"obja");
cout << "A()" << endl;
}
~A()
{
delete[] p;
cout << "~A()" << endl;
}
private:
char *p;
};
class B:public A
{
public:
B()
{
p = new char[10];
strcpy(p, "objb");
cout << "B()" << endl;
}
~B()
{
delete[] p;
cout << "~B()" << endl;
}
private:
char *p;
};
void play(A *base)
{
delete base;
}
int main(void)
{
B *b = new B;
play(b);
return 0;
}
编译运行结果如下:
分解结果发现,在delete base的时候,只是调用了A类的析构函数,而没有调用B类的析构函数,这个时候就造成了内存泄露。这时虚析构函数就派生用场了。
虚析构函数的作用:通过父类指针把所有的子类对象的析构函数都执行一遍,这样就能避免内存泄露问题。
修改代码如下:
class A
{
public:
A()
{
p = new char[10];
strcpy(p,"obja");
cout << "A()" << endl;
}
virtual ~A()
{
delete[] p;
cout << "~A()" << endl;
}
private:
char *p;
};
只需要在基类的析构函数前加上virtual属性。编译运行结果如下:
这时发现A类和B类的析构函数都被执行了。
当然虚析构函数只是用在我们想通过父类指针去释放所有资源的场景,如果我们直接使用子类指针去delete的话,它也会把所有的资源,包括父类、祖先类的析构函数全部都调用一次。