虚析构函数

虚析构函数就是为了当删除一个派生类对象的时候,派生类的析构函数被调用。。。

vs2013编译的一个程序:

头文件:default.h

#include 
#include 
using namespace std;

class CBase
{
public:
	CBase();
	virtual ~CBase();
};

class CDerived : public CBase
{
public:
	CDerived(char *str);
	~CDerived();
private:
	char *name;
};


函数实现:

function.cpp

#include "default.h"

CBase::CBase()
{
	cout << "构造函数CBase被调用!!" << endl;
}

CBase::~CBase()
{
	cout << "析构函数CBase被调用!!" << endl;
}

CDerived::CDerived(char *str)
{
	name = new char[strlen(str) + 1];
	strcpy_s(name,strlen(str)+1 ,str);  //这里的strcpy_s一定要是三个参数
	cout << "构造函数CDerived被调用!!" << endl;
}

CDerived::~CDerived()
{
	cout << "析构函数CDerived被调用!!" << endl;
	if (name)
	{
		delete []name;
		name = NULL;
	}
		
}

主函数:

main.cpp

#include "default.h"

int main(int argc, char* argv [])
{
	CDerived derived("ding");
	CBase *p1 = &derived;
	cout << "----------强制析构----------------" << endl;
	p1->~CBase();
	cout << "----------new CDerived------------" << endl;
	CBase *p2 = new CDerived("zheng");
	delete p2;
	cout << "----------delete CDerived---------" << endl;
	return 0;
}

执行代码的结果:

虚析构函数_第1张图片

当我们把

class CBase
{
public:
	CBase();
	virtual ~CBase();
};

修改为

class CBase
{
public:
	CBase();
	~CBase();
};

把virtual去掉之后编译的结果:

虚析构函数_第2张图片

明显可以看出不用虚析构函数之后,当我们删除派生类CDerived的对象p2的时候,它的析构函数没有被调用!

这里就会造成内存泄露。

而且也不是所有的类都要虚析构函数,一般只用于基类。


你可能感兴趣的:(C++)