首页 / 软件开发 / C++ / 关于MFC下检查和消除内存泄露的技巧
关于MFC下检查和消除内存泄露的技巧2011-04-09freepublic摘要本文分析了Windows环境使用MFC调试内存泄露的技术,介绍了在Windows环境 下用VC++查找,定位和消除内存泄露的方法技巧。关键词:VC++;CRT 调试堆函数; 试探法。编译环境VC++6.0技术原理检测内存泄漏的主要工具 是调试器和 CRT 调试堆函数。若要启用调试堆函数,请在程序中包括以下语句:#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
注意 #include 语句必须采用上文所示顺序。如果更改了顺序,所 使用的函数可能无法正确工作。 通过包括 crtdbg.h,将 malloc 和 free 函数映射 到其“Debug”版本_malloc_dbg 和_free_dbg,这些函数将跟踪内存分配和释放 。此映射只在调试版本(在其中定义了 _DEBUG)中发生。发布版本使用普通的 malloc 和 free 函数。#define 语句将 CRT 堆函数的基版本映射到对应的 “Debug”版本。并非绝对需要该语句,但如果没有该语句,内存泄漏转储包含的 有用信息将较少。在添加了上面所示语句之后,可以通过在程序中包括以下语句来转 储内存泄漏信息:_CrtDumpMemoryLeaks();
当在调试器下运行程序时, _CrtDumpMemoryLeaks 将在“输出”窗口中显示内存泄漏信息。内存泄漏信息如 下所示: Detected memory leaks!
Dumping objects ->
C:PROGRAM FILESVISUAL STUDIOMyProjectsleaktestleaktest.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 时,所显示的会是:内存分配编号(在大括号内)。块类型(普通、客户端或 CRT)。十 六进制形式的内存位置。以字节为单位的块大小。前 16 字节的内容(亦为 十六进制)。定义了 _CRTDBG_MAP_ALLOC 时,还会显示在其中分配泄漏的内存的文 件。文件名后括号中的数字(本示例中为 20)是该文件内的行号。转到源文件中分 配内存的行在"输出"窗口中双击包含文件名和行号的行。-或-在"输出"窗口中选择包含文件名和行号的行,然后按 F4 键。_CrtSetDbgFlag