什么时候使用虚析构函数?如果打算允许其他人通过基类指针调用对象的析构函数,就需要让基类的析构函数成为虚函数,否则执行delete的结果是不确定的
例子:
#include< iostream >
using namespace std;
class Base
{
public:
~Base();//不是虚函数
};
Base::~Base()
{
cout << “Base destructor” << endl;
}
class Derived: public Base
{
public:
Derived();
~Derived();//不是虚函数
private:
int *p;
}
Derived::Derived()
{
p = new int(0);//动态内存分配
}
Derived::~Derived()
{
cout << “Derived destructor” << endl;
delete p;//释放内存
}
void fun(Base *b)
{
delete b;//静态绑定,只会调用~Base()
}
int main()
{
Base *b = new Derived();
fun(b);
return 0;
}
该运行结果只调用了基类的析构函数,此时delete b是静态绑定,只会调用~Base()从而运行后只输出了Base destructor,造成了内存泄漏。
解决方案:将析构函数干成虚析构函数,new Derived()调用了派生类的构造函数为P指针动态分配了内存空间,从而调用派生类的析构函数释放内存空间,派生类析构函数实现完之后调用base类的析构函数,从而运行结果得到了Derived destructor Base destructor。
为什么大部分析构函数是虚函数?
最新推荐文章于 2024-08-21 18:16:36 发布