Windows下内存泄漏检测方法

Windows下内存泄漏检测方法一
1、在主程序的cpp文件里加上以下三行,顺序一定不能颠倒
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
2、在程序退出的时候加上_CrtDumpMemoryLeaks(),如果程序有多个退出的地方,则多个地方要加_CrtDumpMemoryLeaks()比较麻烦,可以在程序的开始处加上_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF)
3、经过实验_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF )和_CrtDumpMemoryLeaks()竟然会发现不一样的内存泄漏
4、_CrtDumpMemoryLeaks()的返回值表示有几处内存泄漏,如果在程序退出是提示程序员有几处内存泄漏肯定会比在Output里提示强的多。可通过如下方式设置:
void Exit()
{
    int i = _CrtDumpMemoryLeaks();
    _ASSERT( i == 0);
}
在程序进入后设置atexit(Exit);

Windows下内存泄漏检测方法二
MFC程序下默认自带内存泄漏检测工具,在Debug模式下会进行内存泄漏检测,不止是MFC下,在VC环境里都有自带的内存泄漏检测技术,在头文件包含如下语句即可:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
注意这些语句一定要在include的下面,不然会出现错误,另外要将工程的code generation选择多线程。我们会发现在cpp文件中只对new做了映射,如果你在程序中直接使用malloc函数分配内存,调用malloc的文件名和行号是不会被记录下来的。如果这块内存发生了泄漏,MS C-Runtime Library仍然能检测到,但是当输出这块内存块的信息,不会包含分配它的的文件名和行号。统资源比如HANDLE,GDI Object,或是不通过C-Runtime Library分配的内存,比如VARIANT,BSTR的泄漏,它是无法检测到的,这是这种检测法的一个重大的局限性。

Windows下内存泄漏检测方法四
Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具,用户可从http://www.codeproject.com/tools/visualleakdetector.asp下载,该软件以库形式与用户的被测工程一起使用,由于VLD是按LGPL(GNU LESSER GENERAL PUBLIC LICENSE)协议对外开源,所以使用VLD是安全的,不必担心版权问题。
使用VLD:先从网站下载VLD的zip包,当前最高版本是V1.0,解压后得到vld.h、 vldapi.h、vld.lib、vldmt.lib、vldmtdll.lib、dbghelp.dll等文件,把这些所有.h头文件拷贝到VC默认的include目录下,将所有.lib文件拷贝到VC默认的lib目录下,安装工作就完成了。
使用VLD很简单,只须在包含入口函数的CPP或C文件中把vld.h头文件包含进来即可。该include语句要求放在最前面,如果当前工程定义预编译head文件(如stdafx.h),则放在“#include <stdafx.h>”语句之后就可以了。

posted @ 2013-06-06 15:26  HiEagle  阅读(1367)  评论(0编辑  收藏  举报