Chinaunix首页 | 论坛 | 博客
  • 博客访问: 573658
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 19:31:24

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) |
给主人留下些什么吧!~~