标签:
在笔试题中,经常会考到“内存泄露”的问题,其中一个就是:
当用基类的指针指向new出来的派生类对象,然后再delete改指针时,会造成内存泄露。
原因大家都很清楚,用基类的指针指向了派生类的对象,派生类对象的结构并未发生变化,当我们delete该基类指针时,只有指向基类的数据成员的内存被释放,而派生类新增的成员占用的内存则仍然存在,这就造成了内存泄露。
解决办法:将基类的析构函数声明为虚函数,即虚析构函数(virtual)。
【程序实例1】
1 #include <iostream> 2 using namespace std; 3 4 class Base{ 5 public: 6 ~Base(){ 7 cout<<"Base deconstructor"<<endl; 8 } 9 }; 10 11 class Derived:public Base{ 12 public: 13 ~Derived() { 14 cout<<"Derived desconstuctor"<<endl; 15 } 16 }; 17 18 int main() 19 { 20 Base *p=new Derived; 21 22 delete p; 23 24 }
【运行结果】
=================================================================
然而,当我们用派生类的指针去指向派生类,然后再delete该指针,会出现内存泄露吗?(问了几个身边的小伙伴,结果没几个敢确定的),于是程序说话:
#include <iostream> using namespace std; class Base{ public: ~Base(){ cout<<"Base deconstructor"<<endl; } }; class Derived:public Base{ public: ~Derived() { cout<<"Derived desconstuctor"<<endl; } }; int main() { Derived *p=new Derived; delete p; }
【运行结果】
可见,这是没有问题的,用相同类型的指针指向相同类型的对象,怎么会造成问题呢?
标签:
原文地址:http://www.cnblogs.com/acode/p/4800637.html