这是网易游戏面我的一道题,当时想了一想,结果答错了,没在意,今天测试了一下,结果才认识到问题所在!
直接看代码:
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)的析构函数,这样子,全部内存都被回收!
时间: 2024-10-10 11:14:47