虚析构函数

来源:互联网 发布:遗传算法求八皇后问题 编辑:程序博客网 时间:2024/05/17 01:14

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

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的时候,它的析构函数没有被调用!

这里就会造成内存泄露。

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


原创粉丝点击