1 现象:问题描述
在系统测试时,在purfiy下看到一处提示内存泄漏.
2 关键过程:根本原因分析
Purify中的提示在
void RequestMsg::setRequestURI(URI *uri)
{
if(NULL == m_pRequestUri)
{
delete m_pRequestUri;
}
m_pRequestUri = uri;
}
在全文中检查此RequestMsg的使用,发现该类的实例,没有提示内存泄漏的,而在析构的地方也已经删除
RequestMsg::~ RequestMsg ()
{
if(NULL != m_pRequestUri)
{
delete m_pRequestUri;
}
}
该类的实例已经全部释放了,为什么会提示其成员变量有内存泄漏呢.检测该类的继承关系,发现父类,发现此父类BaseMsg的析构函数不是虚virtual的.
3 结论:解决方案及效果
原因是疏忽了类的构造和析构机制特点, 析构函数一般是先执行子类的析构,再执行父类的析构,但是当实例在声明为父类时,如果此父类对应的析构函数不是virtual, 则在析构时,不会去执行子类的析构函数.
解决方法为,BaseMsg析构修改为虚的,virtual ~BaseMsg();
4 经验总结:预防措施和规范建议
1. 打好编程基本功, 掌握C++函数的构造/析构,继承机制
2. 编写的代码,应做好测试,特别是使用工具进行内存泄漏的检测
5 备注
考核点
内存泄漏, 析构函数
试题
#include "stdafx.h"
class AClass
{
public:
~AClass(){
printf("~Aclass");
}
};
class BClass:public AClass
{
public:
~BClass(){
printf("~BCalss");
}
};
int main(int argc, char* argv[])
{
AClass* pA = new BClass;
BClass* pB = new BClass;
delete pA;
delete pB;
}
在windows执行上面程序, 下面正确的说法是(C)
A: 屏幕上输出~ACalss~BCalss
B: 屏幕上输出~ACalss~ACalss
C: 屏幕上输出~ACalss~BCalss~ACalss
D: 不确定
阅读(407) | 评论(0) | 转发(0) |