继承中delelte对象子类析构函数不被执行
已知:如果是子类指针指向子类对象,那么构造和析构顺序是:父子子父
但是:如果再多态中,是父类指针指向子类对象,那么需要注意,一定要把父类的析构函数作为虚析构。
因为由于多态,delete对象的时候会调用对象的析构函数,但是如果析构函数不是虚函数的话,那么就会默认调用父类的析构函数【这跟普通虚函数一样,如果不是virtual的,那么默认调用父类函数】
如下:
#include <iostream> class Parent { public: Parent(){} ~Parent(){std::cout << "~Parent."<<std::endl ;} virtual void process() = 0; }; class Son : public Parent { public: Son(){} ~Son(){std::cout << "~Son."<<std::endl;} virtual void process() { std::cout << "process."<<std::endl;} }; int main(){ Parent* son = new Son; son->process(); delete son; }
上面程序只会调用父类析构,子类析构不会被执行,可能产生内存泄漏。
只需要改父类的析构函数为虚析构:
class Parent { public: Parent(){} virtual ~Parent(){std::cout << "~Parent."<<std::endl ;} virtual void process() = 0; }; class Son : public Parent { public: Son(){} ~Son(){std::cout << "~Son."<<std::endl;} virtual void process() { std::cout << "process."<<std::endl;} }; int main(){ Parent* son = new Son; son->process(); delete son; }
长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html