转自:http://blog.xdnice.com/blog84983i63444.html
通过父类指针,释放子类对象时,子类的析构函数可能调不到,导致内存泄漏。
析构函数在对象生命周期结束或释放时调用。
如果基类的析构函数不是虚拟的,那么派生类的析构函数将不会被调用。
虚拟函数的引入是为了实现多态性(polymorphism),而虚拟析构函数是怎么实现多态性的?我想通过以下例子进行说明。 如果基类的析构函数不是虚拟的,那么派生类的析构函数将不会被调用。
虚拟析构函数的作用是确保实例化的对象能够调用自己类实现的虚构函数而被完整的虚构(释放).当通过基类的指针或引用去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的,派生类的析构函数永远不会被调用.如:
#include
using namespace std;
class A {
public: A()
{ cout << "A construction" << endl; }
virtual ~A() //注意这里
{ cout << "A destruction" << endl; } };
class B: public A
{ public: B(){ cout << "B construction" << endl; }
~B(){ cout << "B destruction" << endl; }
};
void main(){
{ B pg; }
cout << "---------------------------" << endl;
{ A *pe = new B( ); delete pe; }
} 程序运行结果:
A construction
B construction
B destruction
A destruction
---------------------------
A construction
B construction
B destruction
A destruction
如果去掉 virtual 结果为:
A construction
B construction
B destruction
A destruction
---------------------------
A construction
B construction
A destruction