您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:68 来源:vckbase.com

本文章共6368字,分5页,当前第1页,快速翻页:
 

VC 6.0 中如何使用 CRT 调试功能来检测内存泄漏

作者:JerryZ

下载例子源代码
逆风编程精品

  最近看了周星星 Blog 中的一篇文章:“VC 6.0中内存泄漏检测”,受益匪浅,便运行其例子代码想看看 Output 窗口中的输出结果,可惜怎么弄其输出都不是预期的东西,郁闷了半天,便到水坛里找到周星星,请求他指点一、二,然而未果。没有办法,最后我一头栽进 MSDN 库狂搜了一把,功夫不负有心人,我搜出很多有关这方面的资料,没过多久我便基本上就找到了答案......
  首先,检测内存泄漏的基本工具是调试器和 CRT 调试堆函数。为了使用调试堆函数,必须在要检测内存泄漏和调试的程序中添加下面的语句:

#define _CRTDBG_MAP_ALLOC 

#include<stdlib.h> 

#include<crtdbg.h> 



#include "debug_new.h" 

  MSDN 如是说:“必须保证上面声明的顺序,如果改变了顺序,可能不能正常工作。”至于这是为什么,我们不得而知。MS 的老大们经常这样故弄玄虚。
  针对非 MFC 程序,再加上周星星的头文件:debug_new.h,当然如果不加这一句,也能检测出内存泄漏,但是你无法确定在哪个源程序文件中发生泄漏。Output 输出只告诉你在 crtsdb.h 中的某个地方有内存泄漏。我测试时 REG_DEBUG_NEW 没有起作用。加不加这个宏都可以检测出发生内存分配泄漏的文件。
  其次,一旦添加了上面的声明,你就可以通过在程序中加入下面的代码来报告内存泄漏信息了:

      _CrtDumpMemoryLeaks(); 
  这就这么简单。我在周星星的例子代码中加入这些机关后,在 VC 调试会话(按 F5 调试运行) Output 窗口的 Debug 页便看到了预期的内存泄漏 dump。该 dump 形式如下:
Detected memory leaks! 

Dumping objects -> 

c:\Program Files\...\include\crtdbg.h(552) : {45} normal block at 0x00441BA0, 2 bytes long. 

Data: <AB> 41 42 

c:\Program Files\...\include\crtdbg.h(552) : {44} normal block at 0x00441BD0, 33 bytes long. 

Data: < C > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD 

c:\Program Files\...\include\crtdbg.h(552) : {43} normal block at 0x00441C20, 40 bytes long. 

Data: < C > E8 01 43 00 16 00 00 00 00 00 00 00 00 00 00 00 

Object dump complete. 

更具体的细节请参考本文附带的源代码文件。

  下面是我看过 MSDN 资料后,针对“如何使用 CRT 调试功能来检测内存泄漏?”的问题进行了一番编译和整理,希望对大家有用。如果你的英文很棒,那就不用往下看了,建议直接去读 MSDN 库中的技术原文。
  C/C 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C 应用程序正好印证了这句话。在 C/C 应用程序开发过程中,动态分配的内存处理不当是最常见的问题。其中,最难捉摸也最难检测的错误之一就是内存泄漏,即未能正确释放以前分配的内存的错误。偶尔发生的少量内存泄漏可能不会引起我们的注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种 各样的征兆:从性能不良(并且逐渐降低)到内存完全耗尽。更糟的是,泄漏的程序可能会用掉太多内存,导致另外一个程序垮掉,而使用户无从查找问题的真正根源。此外,即使无害的内存泄漏也可能殃及池鱼。
  幸运的是,Visual Studio 调试器和 C 运行时 (CRT) 库为我们提供了检测和识别内存泄漏的有效方法。下面请和我一起分享收获——如何使用 CRT 调试功能来检测内存泄漏?
 

本文章更多内容1 - 2 - 3 - 4 - 5 - 下一页>>
相关文章

完美实现真彩自绘菜单
控件如何传递自定义struct
文件系统识别器
用 ATL ActiveX 绘制任意平面函数的曲线
软件框架的利器、TangramMini组件应用教程四
如何让一个打开的文档成为活动文档
消息值,托管字符串,扰乱代码及其它
修改一个完全颜色的CListCtrl类
编程之道
更新MFC中的视图,跟踪.NET Framework中的事
软件开发专业相关的英文简历及其资源
定制调试诊断工具和实用程序——摆脱DLL“地
发掘 C# 特性赋予科学计算项目以威力
《系统飞狐》中获取系统信息的方法
使用 Http 在线自动升级程序
UTF-8与GB2312之间的互换
在VC中调用DirectShow全屏播放视频
案例研究:If-Trader 订单流程处理系统
介绍一个操作DHTML表格的C 对象
在非MFC程序中引用CString

相关评论


本文章所属分类:首页 VC++

  热门关键字: