虚析构基类函数

梦想游戏人
目录:
C/C++

考虑以下代码

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 关键字,虽然虚函数表有额外系统开支,但是对于避免内存泄露  特别是需要内存自动管理的时候,

优点显而易见了

Scroll Up