5

不用虚析构函数也不会造成内存泄漏的原因是什么?

代码如下:
#include
using namespace std;
class Base
{
public :
Base(){}
virtual void fun(){ cout << "from Base :" << endl; }
~Base(){ cout << "from Base destructor:" << endl; fun(); }
int b;
};
class Derive : public Base
{
public:
Derive(){ }
virtual void fun(){cout << "from Derive :" << endl;}
~Derive(){ cout << "from Derive destructor:" << endl; fun(); }
int asdfasd[100][100][100];

};
int main()
{
while(true)
{
Base *p = new Derive;
delete p;
}

return 0;
}
可以看到派生类比基类多了一个非常大的数组,如果这个数组真的没有回收的话,不用2秒钟,系统内存就满了。
这一点已测试。具体就是把delete p;注释掉,内存使用量咔咔往上涨,不到2秒系统强制停止了该进程。
但是如果加上delete p;这句就不会,提请注意的是,这里的析构函数并非虚函数,从输出结果也可以看出,程序只调用了基类的析构函数,并未调用派生类的析构函数,那么显然派生类的数据并没有回收,但是从结果上看,系统内存保持一个定值,根本没有上涨,运行多久都可以。
我当然知道虚析构函数适用于在类内有动态申请内存空间的情况,但是我仍然想不明白这里的、派生类独有的内存到底是怎么回收的。

查看全部
qq906237201
qq906237201
2016/05/01 09:52
  • 点赞
  • 收藏
  • 回答
    私信
满意答案
查看全部

6个回复