为什么父类的析构函数是虚函数

代码中用基类指针接收new出的Derived类资源,析构时编译器只析构基类部分,会造成内存泄露。将基类析构函数改成虚函数可避免,因为虚函数后绑定,会先执行子类虚函数再执行父类的,释放子类和父类内存。多态时应将析构函数写成虚函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Base 
{ 
public: 
    Base() { mPtr = new int; } 
    ~Base() { delete mPtr; cout<<"Base::Destruction"<<endl;} 
private: 
    int* mPtr; 
} ;

class Derived : public Base 
{ 
public: 
    Derived() { mDerived = new long; } 
    ~Derived() { delete mDerived; cout<<"Derived::Destruction"<<endl;} 
private: 
    long* mDerived; 
} ;

void main() 
{ 
    Base* p = new Derived; 
    delete p; 
}

以上代码会产生内存泄露,因为new出来的是Derived类资源,采用一个基类的指针来接收,析构的时候,编译器因为只是知道这个指针是基类的,所以只将基类部分的内存析构了,而不会析构子类的,就造成了内存泄露,如果将基类的析构函数改成虚函数,就可以避免这种情况,因为虚函数是后绑定,其实就是在虚函数列表中,析构函数将基类的析构函数用实际对象的一组析构函数替换掉了,也就是先执行子类的虚函数再执行父类的虚函数,这样子类的内存析构了,父类的内存也释放了,就不会产生内存泄露。
注:
1.析构函数其实是一个函数,不论子类还是父类,虽然可能看起来名字不一样。而且析构函数执行过程都是执行子类再到父类。
2.多态的时候一定要将析构函数写成虚函数,防止内存泄露,各个子类维护自己内部数据释放。


原文:https://blog.youkuaiyun.com/u011740322/article/details/10081505

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值