您的位置:首页 > 编程语言 > C语言/C++

C++中析构函数为什么要是虚函数

2011-08-17 22:50 393 查看
//////////////////////////////////////////////////////

//Example 1

//////////////////////////////////////////////////////

#include <iostream.h>

class CFunction
{
public:
CFunction()
{
data = new char[64];
};

~CFunction()
{
delete [] data;
};

char *data;

};

class CFunctionEx : public CFunction

{
public:
CFunctionEx()
{
m_data = new char[64];
};

~CFunctionEx()
{
delete [] m_data;
};

private:
char *m_data;

};

void main()
{
CFunction *pCFun = new CFunctionEx;

delete pCFun;

}

你能看出什么问题吗?很显然,有内存泄漏。这是因为当删除pCFun时,它只调用了Cfunction的析构函数而没调用CfunctionEx的析构函数,所以导致内存泄漏。再看下例:

//////////////////////////////////////////////////////

//Example 2
//////////////////////////////////////////////////////

#include <iostream.h>

class CBase

{

public:

CBase()
{
data = new char[64];
};

~CBase()
{
delete [] data;
};

char *data;

};

class CFunction

{

public:

CFunction(){};
~CFunction(){};

};

class CFunctionEx : public CFunction

{

public:

CFunctionEx(){};
~CFunctionEx(){};

private:

CBase m_cbase;

};

void main()

{

CFunction *pCFun = new CFunctionEx;

delete pCFun;

}
你能看出什么问题吗?这里CfunctionEx和Cfunction中本身并没有分配内存,应该不会有内存泄漏。和上例一样当删除pCFun时,它只调用了Cfunction的析构函数而没调用CfunctionEx的析构函数,但CfunctionEx本身并没分配内存,是什么地方有内存泄漏我不说大家也应该知道了吧。不错是m_cbase,因为它是Cbase的实例且是CfunctionEx成员变量,当CfunctionEx的的析构函数没有被调用时,当然m_cbase的析构函数也没有被调用,所以Cbase中分配的内存被泄漏。

解决以上问题的方法很简单,就是使基类Cfunction的析构函数为虚函数就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ delete class