在Effective C++ 中,Scott Meyers在《条款07:为多态基类声明virtual析构函数》中提到,当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未有定义——实际执行时通常发生的是对象的derived成分没有被销毁。也就是说,如果派生类继承了父类的情况下,如果父类的析构函数不是虚函数,而在使用中用了多态的写法,就会导致没有调用到派生类的析构函数,导致资源没有释放,造成泄漏。
先看一个错误的写法:
class TimeKeeper {
public:
TimeKeeper();
~TimeKeeper();
}
class AtomicClock: public TimeKeeper{...};
class WaterClock: public TimeKeeper{...};
TimeKeeper* ptk = getTimeKeeper(); //假设这里获取的是AtomicClock实例。
delete ptk;//仅调用了TimeKeeper的析构函数,没有调用到AtomicClock的析构函数,容易造成AotmicClock中的资源未被释放。
正确写法:
class TimeKeeper {
public:
TimeKeeper();
virtual ~TimeKeeper();
}
class AtomicClock: public TimeKeeper{...};
class WaterClock: public TimeKeeper{...};
TimeKeeper* ptk = getTimeKeeper(); //假设这里获取的是AtomicClock实例。
delete ptk;//因为父类中的析构函数为虚函数,会调用派生类的虚函数,释放掉AtomicClock的资源。