标题:基类析构函数设计


当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。实际运行时经常发生的是,派生类的析构函数永远不会被调用,那么派生类的资源也将无法被释放。

 

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();

}

 

 

当然,如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,声明析构函数为虚函数则是个坏主意,因为这将带来不必要的开销(增加了虚函数表指针)。




看文字不过瘾?点击我,进入腾讯课堂视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注