ITPub博客

首页 > IT基础架构 > 网络安全 > 一种不易察觉的内存泄露 (转)

一种不易察觉的内存泄露 (转)

原创 网络安全 作者:gugu99 时间:2007-10-30 16:29:37 0 删除 编辑
一种不易察觉的内存泄露 (转)[@more@]

一种不易察觉的内存泄露

电子科技大学
朱宁

---- 最近,笔者用VC++编写一个屏幕保护程序的时候,发现了内存泄露的问题,感到 非常困惑。后来,在参考几个例子的基础上,解决了这个问题。下面让我们分析 其原因和处理方法:

---- 笔者由CWnd派生了一个子类CDrawWnd, 在主程序类的InitInstance()中添加了 如下代码:

m_pMainWnd=new CDrawWnd(); m_pMainWnd- >Create(.....); return TRUE;


---- 在调试运行通过后,VC++的调试器报告内存泄露。显然,问题只可能出在上面的 第一行代码上。开始我编写上述代码时,也怀疑 new 没有对应的 delete ,将导 致堆内存无法收回,但是,参考VC++5.0的例子 "Hello" ,该程序这部分的代码 与上述无异,也没有其他函数调用delete 回收堆内存,但并不造成内存泄露。 查看VC++的在线帮助,并没有详细的说明,只是说关闭窗口时,自动调用虚函数 PostNCDestory回收m_pMainWnd指向的内存.

---- 于是笔者尝试在主程序类的析构函数中调用 delete m_pMainWnd ,没有效果。显式 调用CWnd::DestoryWindow()也不起作用。参考例子saver, 发现它前面的实现代码 与笔者的完全相同,但是,它在CDrawWnd类中重载了PostNCDestory虚函数,其中 有一行关键的代码:

delete this;


---- 事实上,是它销毁了CDrawWnd对象

---- 于是立刻修改了我的程序,在主窗口类中重载了PostNCDestory函数,加入以上语 句,立刻解决了内存泄露的问题。

---- 原因终于明白了,原来,如果程序主窗口类是从CFrameWnd继承的,不需要人工 回收类对象占用的内存,象"hello"例子就是这样的程序。但是如果是从Cwnd类 直接继承的主窗口类,就必须考虑这个问题。


 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10748419/viewspace-979624/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    3122
  • 访问量
    2222865