内存泄露如何调试

来源:互联网 发布:mac word 首选项 编辑:程序博客网 时间:2024/05/09 21:49

一、动态分配、回收内存是C/C++编程语言一个最强的特点,但是中国哲学家孙(Sun Tzu,我不知道是谁?那位知道?) 指出,最强的同时也是最弱的。这句话对C/C++应用来说非常正确,在内存处理出错的地方通常就是BUGS产生的地方。一个最敏感和难检测的BUG就是内 存泄漏-没有把前边分配的内存成功释放,一个小的内存泄漏可能不需要太注意,但是程序泄漏大块内存,或者渐增式的泄漏内存可能引起的现象是:先是性能低 下,再就是引起复杂的内存耗尽错误。最坏的是,一个内存泄漏程序可能用完了如此多的内存以至于引起其他的程序出错,留给用户的是不能知道错误到底来自哪 里。另外,一个看上去无害的内存泄漏可能是另一个问题的先兆。幸运的是VC++DEBUGER和CRT库提供了一组有效的检测和定位内存泄漏的工具。本文 描述如何使用这些工具有效和系统的排除内存泄漏。

二、启动内存泄漏检测:主要的检测工具是DEBUGER和CRT堆除错函数。要使除错函数生效,必须要在你的程序中包含以下几个语句: #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include< crtdbg.h>并且这些#include 语句必须按上边给出的顺序使用。如果你改变了顺序,可能导致使用的函数工作不正常。包含crtdbg.h的作用是用malloc和free函数的 debug版本(_malloc_dbg 和 _free_dbg)来替换他们,他们能跟踪内存分配和回收。这个替换仅仅是在debug状态下生效,Relese版本中还是使用普通的malloc和 free函数。上面的#define语句使用crt堆函数相应的debug版本来替换正常的堆函数。这个语句不是必需的,但是没有他,你可能会失去一些有用的内存泄漏信 息。你一旦在你的程序中增加了以上的语句,你可以通过在程序中增加_CrtDumpMemoryLeaks();函数来输出内存泄漏信息。当你在debuger下运行你的程序时,_CrtDumpMemoryLeaks 显示内存泄漏信息在OutPut窗口的Debug标签项里。

三、Detected memory leaks! Dumping objects -> C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.如果你没有使用#define _CRTDBG_MAP_ALLOC语句的话,输出信息将如下: Detected memory leaks! Dumping objects -> {18} normal block at 0x00780E80, 64 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.像你所看到的,当_CRTDBG_MAP_ALLOC 被定义后_CrtDumpMemoryLeaks给了你很多有用的信息。在没有定义_CRTDBG_MAP_ALLOC 的情况下,显示信息包含: 1.内存分配的编号(大括弧中的数字); 2.内存块的类型(普通型、客户端型、CRT型); 3.16进制表示的内存位置; 4.内存快的大小; 5.前16bytes的内容。如果定义了_CRTDBG_MAP_ALLOC ,输出信息还包含当前泄漏内存是在那个文件中被分配的定位信息。文件名后圆括弧中的数字是行数。如果你双击这行信息, C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.光标就会跳转到原文件中分配这个内存的行前。选择Output中的题是行,按F4能达到同样的效果

原创粉丝点击