虚析构基类函数
考虑以下代码
class Ref { public: virtual ~Ref() { cout << "~Ref()" << endl; } }; class People :public Ref { public: ~People() { cout << "~People()" << endl; } };
以下代码输出什么?
int main(int argc, char *argv[]) { { People hk; } system("pause"); return 0; } 没错,先析构子类,然后父类,这时候基类析构函数~Ref 有无virtual 都没关系
考虑以下代码输出什么
int main(int argc, char *argv[]) { Ref *hk=new People; delete hk; system("pause"); return 0; } 这个也没问题,多态嘛,子类部分 和 基类部分 都能正确析构 。 如果此时 基类析构函数没有virtual关键字,那么问题来了,由于hk是指向Ref的指针,所以delete操作时, 只是析构了 基类Ref ,而子类部分 没有被delete 后果就是导致内存泄露,子类部分没有被析构 这个很容易验证。 也就是为什么上篇文章的Ref类 release中的 delete this为什么能够 删除子类和基类,因为对于ref类来说 this也就是上面代码的 hk, 虽然看起来没有 Ref *hk=new People; 这个直观看出来是多态,但是基类this指向的有效地址 其实还是new People 只不过这个被赋予了基类 this和子类this .
所以一般情况下来说 析构函数尽量使用virtual 关键字,虽然虚函数表有额外系统开支,但是对于避免内存泄露 特别是需要内存自动管理的时候,
优点显而易见了