一种不易察觉的内存泄露

原创 2001年01月21日 15:14:00
 

 

电子科技大学
朱宁

---- 最近,笔者用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类 直接继承的主窗口类,就必须考虑这个问题。

 

一种不易察觉的内存泄露

2001年01月21日 15:14:00 电子科技大学 朱宁 ---- 最近,笔者用VC++编写一个屏幕保护程序的时候,发现了内存泄露的问题,感到 非常困惑。后来,在参考几个例子的基础上,...
  • softart
  • softart
  • 2007年10月27日 07:49
  • 138

C语言中不易察觉的错误

一,空语句空语句“;”也是一条语句,该语句什么都不执行。常见错误为紧跟在if或循环语句之后,如if(); for();等,如果后面没有{},则默认空语句为if(或for)条件成立时执行的语句。你的在某...
  • hbuxiaoshe
  • hbuxiaoshe
  • 2010年12月01日 12:15
  • 1114

【Python】闭包中一个不易察觉的陷阱

Python语言是支持函数式编程的,我们可以在一个函数的函数体中定义另一个完整的函数,甚至返回这个函数.在函数内部定义的函数和外部定义的函数是相同的,唯一的区别就是在函数内部定义的函数是不能被外部访问...
  • lchad
  • lchad
  • 2015年02月27日 15:52
  • 4040

Windows Phone 8.1中Button不易察觉的用法

2. Content属性-----Button的内容属性 当然,可以直接设置Content值,但是它是属于内容语法设置属性,即可忽略其为属性元素,看作元素对象的内容更 为确切一些。所以我们可以给B...
  • u010792238
  • u010792238
  • 2015年05月22日 16:41
  • 553

最近遇到的一个数组越界的BUG

关于二维数组的问题,之前在我代码中有如下这样一段,(//CMD:DS:1234567890abcd:1234567890:5:0016:44:BLE A IM 20:73:6a:18:ec:e8,11...
  • mt6246
  • mt6246
  • 2015年11月20日 18:50
  • 222

【java8】Java 8中10个不易察觉的错误

Java8新特性和lambda表达式Java 8 Lambda表达式,让写代码不再繁琐Java 8新增特性优缺点Java8在并发工具方面的加强Java 8中10个不易察觉的错误示例讲解如何用Java ...
  • moshenglv
  • moshenglv
  • 2018年01月19日 14:11
  • 41

MyEclipse部署Web Project时,一个不易察觉的问题

在win7的操作系统下,安装了MyEclipse2014,创建一个Web Project项目test2,在部署这个WebProject,运行时出现了一个错误:                  ...
  • moon__stone888888
  • moon__stone888888
  • 2016年06月28日 19:07
  • 388

PHP 容易犯的不易察觉的错误

总结一下PHP 容易犯的不易察觉的错误: count()函数 $sum = count(false); echo $sum; // 结果 输出1 而不是0...
  • u012408083
  • u012408083
  • 2016年11月28日 09:37
  • 187

容易忽略的Java知识点(整理ing)

由于最近在准备一些笔试复习到的相关Java知识点,不禁感慨:这么多年对Java懂得还太少!      1、关于finally关键字       IBMDeveloperWorks中有一篇已经说明地...
  • boy306
  • boy306
  • 2015年04月01日 20:19
  • 390

可扩展架构取舍

引言:“架构”是前端开发中一直以来都缺少的。由于近几年Web应用日趋复杂,前端架构开始流行起来。成熟的工具使得开发人员可以针对要解决的问题设计出可扩展的架构。 构建可扩展的软件,可以从很多角度来思考软...
  • broadview2006
  • broadview2006
  • 2017年02月28日 16:40
  • 1369
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一种不易察觉的内存泄露
举报原因:
原因补充:

(最多只允许输入30个字)