为什么大部分析构函数是虚函数?

什么时候使用虚析构函数?如果打算允许其他人通过基类指针调用对象的析构函数,就需要让基类的析构函数成为虚函数,否则执行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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值