请自觉为多态的基类声明virtual析构函数

最近做的项目一直会用到多态的思想,所以会考虑到如何能够正确有效的释放对象资源(包括基类与派生类)。为什么会考虑到这个问题呢?C++ 不像Java即使编程者忘记对资源的释放,java仍然提供缺省的机制来释放资源。所以说如果你一直从事与C++开发,这个问题是逃不掉的。那么现在有什么好的方法么?

比如举个简单的例子,我们有许多办法可以记录时间。我们可以先设计一个base class TimeKeeper 和一些derived class 来记录不同的时间

class TimeKeeper {

public :

TimerKeeper();

~TimerKeeper();

};

class AtomicClock  :  public TimerKeeper {...}

class WaterClock  :  public TimerKeeper{...}

//然后我们用bass class 的指针指向子类创建的对象

TimeKeeper* t1 = new AtomicClock();

TimeKeeper* t2 = new WaterClock();

...

//用完之后选择释放资源

delete t1;

delete t2;

上述代码表面上看没有任何的错误,编译时也ok.但是当用起来时。却会报内存泄漏!!为啥会这样呢?那么我们就分析下原因。

首先我们知道子类继承父类,其实就是继承虚函数表。那么当我们想释放 base指针,就会调用不到dervied 的析构函数。以为子类的析构函数只能释放它内部的子对象。这样就遇到了非常尴尬的状况了。出现了一个非常严重的内存泄漏问题。

所以当你想创建一个base 类,而且想derived其他类。请加上virtual关键字的析构函数。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值