码迷,mamicode.com
首页 > 其他好文 > 详细

虚析构基类函数

时间:2015-06-24 14:47:55      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:



考虑以下代码

class Ref
{
public:
	virtual ~Ref()
	{
		cout << "~Ref()" << endl;
	}
};

class People :public Ref
{
public:
	~People()
	{
		cout << "~People()" << endl;
	}
};


以下代码输出什么?

int main(int argc, char *argv[])
{
	{
		People hk;
	}


	system("pause");
	return 0;
}

没错,先析构子类,然后父类,这时候基类析构函数~Ref 有无virtual 都没关系



考虑以下代码输出什么

int main(int argc, char *argv[])
{
	
		Ref *hk=new People;
	
		delete hk;

	system("pause");
	return 0;
}

这个也没问题,多态嘛,子类部分 和 基类部分  都能正确析构 。



如果此时 基类析构函数没有virtual关键字,那么问题来了,由于hk是指向Ref的指针,所以delete操作时,
只是析构了 基类Ref ,而子类部分 没有被delete 后果就是导致内存泄露,子类部分没有被析构  这个很容易验证。
也就是为什么上篇文章的Ref类 release中的 delete this为什么能够 删除子类和基类,因为对于ref类来说
this也就是上面代码的 hk, 虽然看起来没有 Ref *hk=new People;  这个直观看出来是多态,但是基类this指向的有效地址
其实还是new People 只不过这个被赋予了基类 this和子类this 

.

所以一般情况下来说 析构函数尽量使用virtual 关键字,虽然虚函数表有额外系统开支,但是对于避免内存泄露  特别是需要内存自动管理的时候,

优点显而易见了

虚析构基类函数

标签:

原文地址:http://my.oschina.net/kkkkkkkkkkkkk/blog/470153

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!