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

来源:互联网 发布:软件配置管理人员职责 编辑:程序博客网 时间:2024/04/30 11:46

最近做的项目一直会用到多态的思想,所以会考虑到如何能够正确有效的释放对象资源(包括基类与派生类)。为什么会考虑到这个问题呢?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关键字的析构函数。






0 0
原创粉丝点击