本文主要是介绍请自觉为多态的基类声明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关键字的析构函数。
这篇关于请自觉为多态的基类声明virtual析构函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!