什么时候需要将析构函数定义为虚函数,如果不这么做,会存在什么问题?

这是网易游戏面我的一道题,当时想了一想,结果答错了,没在意,今天测试了一下,结果才认识到问题所在!

直接看代码:

class Interface {
public:
    virtual void fun() = 0;
    Interface() {
        cout<<"Interface::Interface()"<<endl;
        _data = new char[10];
    }
    virtual ~Interface() {
        cout<<"Interface::~Interface()"<<endl;
        delete [] _data;
    }
protected:
    char *_data;
};

class Implement: public Interface {
public:
    void fun() {
        cout<<"This is Implement object."<<endl;
    }

    Implement() {
        cout<<"Implement::Implement()"<<endl;
        _ba = new char[10];
    }

    ~Implement() {
        cout<<"Implement::~Implement()"<<endl;
        delete []_ba;
    }
private:
    int a;
    char *_ba;
};

下面,我们来分析一下问题所在:

1)如果基类(Interface)的析构函数不为虚函数

//内存泄露(子类析构函数没有被调用)
    Interface *base = new Implement();
    delete base;

base则找不到子类的析构函数,因此,只调用了父类自身的析构函数,因此造成内存泄露;

2)如果基类(Interface)的析构函数为虚函数,那么虚函数表就会多了一个函数指针,这个函数指针方便了base找到正确的析构函数(子类Implement析构函数),而子类的析构函数会自动调用基类(Interface)的析构函数,这样子,全部内存都被回收!

 

posted @ 2015-09-05 11:58  wiessharling  阅读(848)  评论(0编辑  收藏  举报