当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。实际运行时经常发生的是,派生类的析构函数永远不会被调用,那么派生类的资源也将无法被释放。
class A
{
public:
A();
~A();
virtual int Func();
}
class B: public A
{
public:
B();
~B();
virtual int Func();
private:
char *m_buf;
}
B::B()
{
m_buf = (char *)malloc(100);
}
B::~B()
{
if (m_buf)
delete m_buf;
}
A *pa = new B();
delete pa;
pa = NULL;
类B继承于类A。由于A中没有把析构函数没有声明为虚函数,则在执行delete pa时,B的析构函数将不会被调用。因此m_buf的内存就无法释放。
因此,若一个类含有虚函数,就应当确保它有虚析构函数。
class A
{
public:
A();
virtual ~A();
virtual int Func();
}
当然,如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,声明析构函数为虚函数则是个坏主意,因为这将带来不必要的开销(增加了虚函数表指针)。
Copyright 2011-2020 © MallocFree. All rights reserved.