技术交流QQ群:1027579432,欢迎你的加入!
Cpp中的虚析构函数
- 1.虚析构函数的作用:为了避免内存泄漏,而且是当子类中会有指针成员变量时才会使用到。即虚析构函数使得在删除指向子类对象的基类指针时,可以调用子类的析构函数来实现释放子类中堆内存的目的,从而防止内存泄漏。
- 2.C++中开发中,基类中的析构函数一般都是虚函数,如下面的例子:
#include <iostream> using namespace std; // 基类 class Base{ public: Base(){}; virtual ~Base(){ // 基类的析构函数是虚函数! cout << "delete Base\n"; }; virtual void DoSomething(){ cout << "Do Something in class Base!\n"; }; }; // 派生类 class Derived: public Base{ public: Derived(){}; ~Derived(){ cout << "delete Derived\n"; }; void DoSomething(){ cout << "Do Something in Derived\n"; }; }; int main(){ Base *b = new Derived; b->DoSomething(); // 重写DoSomething函数 delete b; return 0; }
基类中的析构函数是虚析构函数.jpg
-
3.如果把基类Base中的虚析构函数改成普通析构函数,结果如下所示。也就是说,派生类Derived中的析构函数压根就没有被调用!一般来说,类的析构函数用来释放内存中的资源,当析构函数没有被调用的话,就会造成内存泄漏。
基类中的析构函数不是虚析构函数.jpg - 4.虚析构函数作用总结:
- (a) 如果基类的析构函数不加virtual关键字,那么就是普通析构函数
- 当基类中的析构函数没有声明为虚析构函数时,派生类开始从基类继承,基类的指针指向派生类的对象时,delete基类的指针时,只会调用基类的析构函数,不会调用派生类的析构函数。
- (b) 如果基类的析构函数加virtual关键字,那么就是虚析构函数
- 当基类中的析构函数声明为虚析构函数时,派生类开始从基类继承,基类的指针指向派生类的对象时,delete基类的指针时,先调用派生类的析构函数,再调用基类中的析构函数。
- (a) 如果基类的析构函数不加virtual关键字,那么就是普通析构函数