虚析构函数就是为了当删除一个派生类对象的时候,派生类的析构函数被调用。。。
vs2013编译的一个程序:
头文件:default.h
#include <iostream>
#include <cstring>
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;
}
执行代码的结果:
当我们把
class CBase
{
public:
CBase();
virtual ~CBase();
};
修改为
class CBase
{
public:
CBase();
~CBase();
};
把virtual去掉之后编译的结果:
明显可以看出不用虚析构函数之后,当我们删除派生类CDerived的对象p2的时候,它的析构函数没有被调用!
这里就会造成内存泄露。
而且也不是所有的类都要虚析构函数,一般只用于基类。