#include <iostream> using namespace std; class BaseA { public: BaseA(){cout <<"BaseA::BaseA()" <<endl;} ~BaseA(){cout <<"BaseA::~BaseA()" <<endl;} };
class DevA : public BaseA { public: DevA(){ p = new char[10];cout <<"DevA::DevA()" <<endl;} ~DevA(){ delete[] p;cout <<"DevA::~DevA()" <<endl;} private: char *p; };
int main(){BaseA *a = new DevA();delete a;return 0;}在上面的例子中它不会调用DevA类中的析构函数,其实这种情况先有肯发生能出泄露。假设我DevA像下列声明:
那么指针p的内存将得不到回收。为什么p的内存没有被回收,因为程序没有调用DevA的析构函数所以碰到这种问题我们只需将class DevA : public BaseA { public: DevA(){p = new char[10]; cout <<"DevA::DevA()" <<endl;} ~DevA(){delete[] p; cout <<"DevA::~DevA()" <<endl;} private: char *p; };
BaseA的析构函数声明为virtual就行,这样在delete a时他会被动态绑定调用DevA的析构函数。当然不是所有类的析构函数都要virtual
所以基本的一条是,无故的声明虚析构函数和永远不去声明一样是错误的。实际上,很多人这样总结:当且仅当类里包含至少一个虚函数的时候才去声明虚析构函数。
当然上述方法不是一条定理,能适用于所有的地方,本文的第二个例子就不适用。