请看父类Base类没有定义虚析构函数的例子:
#include <iostream>
class Base
{
public:
virtual int start()
{
std::cout<<"Base::start"<<std::endl;
}
~Base()
{
std::cout<<"Base::~Base() "<<std::endl;
}
};
class Derived : public Base
{
public:
virtual int start()
{
m_pInt = new int [10];
std::cout<<"Derived::start()"<<std::endl;
}
~Derived()
{
std::cout<<"Derived::~Derived()"<<std::endl;
if(NULL != m_pInt)
{
delete m_pInt;
m_pInt = NULL;
}
}
private:
int *m_pInt;
};
int main()
{
Base *pBase = new Derived();
pBase->start();
delete pBase;
pBase = NULL;
return 0;
}
执行结果
对不起,使用基类指向派生类,释放类对象时,没有执行到Derived类的析构函数,使得Derived类申请有堆内存或者申请有资源的情况,会造成内存泄漏或资源泄漏。
解决方法: 基类的析构函数定义为虚析构函数,这样的使用基类指向派生类,删除基类指针时,能执行到Derived类的析构函数。
#include <iostream>
class Base
{
public:
virtual int start()
{
std::cout<<"Base::start"<<std::endl;
}
virtual ~Base()
{
std::cout<<"Base::~Base() "<<std::endl;
}
};
class Derived : public Base
{
public:
virtual int start()
{
m_pInt = new int [10];
std::cout<<"Derived::start()"<<std::endl;
}
virtual ~Derived()
{
std::cout<<"Derived::~Derived()"<<std::endl;
if(NULL != m_pInt)
{
delete m_pInt;
m_pInt = NULL;
}
}
private:
int *m_pInt;
};
int main()
{
Base *pBase = new Derived();
pBase->start();
delete pBase;
pBase = NULL;
return 0;
}