析构函数为你提供了一种机制,可以让你在系统释放对象前做一些善后工作,如清理内存,释放空间等。但是在以下两个方面使用虚构函数时要尤为注意。
1. 多态性
具有多态性质的base classes的析构函数应该为virture,或者说任何带有virture函数的class都应该有virture析构函数。考虑下面的代码:
class A{
A();
~A();
......
};
class B: public A{
......
};
int main(){
B b;
A* p = &b;
......
delete p;
}
如果以上代码出现在你的项目中,那么就会造成灾难性的后果。在上述代码中,B类的对象经由一个base class(A类)指针被删除,但是base class(A类)有个non-virture析构函数,这就导致其内的B类成分没有被销毁(声明于B类的成员变量),然而其base class成分(也就是A类这一部分)通常会被销毁,于是导致一个诡异的“局部销毁”对象。资源泄露、败坏数据结构等问题都会因此而产生。