基类析构函数定义为虚函数:当析构函数不加上virtual时,基类指针指向派生类delete时,不会调用派生类的析构函数,造成内存泄漏。
基类的析构函数加上virtual之后,当要调用基类的析构函数时,编译器会从虚函数表中找到要执行的正确的函数地址,即派生类的析构函数去调用。
无内存泄漏
#include基类析构函数未定义为虚函数:#define debug qDebug()<< class Base { public: Base() {} virtual ~Base() { std::cout << "基类析构" << std::endl; } }; class Derived : public Base { public: Derived() {}; ~Derived() { std::cout << "派生类析构" << std::endl; } }; int main(int argc, char *argv[]) { Base * pbase = new Base; delete pbase; std::cout << "------------" << std::endl; pbase = new Derived; delete pbase; }
有内存泄漏
#include#define debug qDebug()<< class Base { public: Base() {} ~Base() { std::cout << "基类析构" << std::endl; } }; class Derived : public Base { public: Derived() {}; ~Derived() { std::cout << "派生类析构" << std::endl; } }; int main(int argc, char *argv[]) { Base * pbase = new Base; delete pbase; std::cout << "------------" << std::endl; pbase = new Derived; delete pbase; }



