CRT调试内存泄露

来源:互联网 发布:网络直播合同范本 编辑:程序博客网 时间:2024/05/16 10:10

使用VS自带的模块CRT检测内存泄露,方法:

在cpp文件中,包含:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

////为了定位cpp中泄露的具体位置,做如下定义:

#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif

///

在程序结束的位置定义_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

Debug版本的 CRT定义了一套调试版本的内存分配函数(如_malloc_dbg)。当你包含了CRTDBG.h后,如果当前是Debug工程,十有八九会有_DEBUG宏,这时,malloc函数会被被映射为_malloc_dbg。

当如果是Release版本,它什么都不做。这样以来,如果是Debug版本,我们调用的malloc或者new,其实最终调用的都是_malloc_dbg。而_malloc_dbg会分配更多的内存,用来存储调试信息,用来跟踪内存分配和释放是否对应。

当我们在Debug版本中调用malloc时候,其调用的是_malloc_dbg,
只在Debug版本中有效(定义了_DEBUG,链接到Debug CRT库)。Rlease版本使用正常的malloc和free。

在你的程序即将退出的时候,调用此函数,就能打印内存泄露信息。但我们的代码可能很复杂,有多个结束点。定义如下函数

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );


如果要检测某代码有否泄露,必须将每个cpp文件都增加以上的语句包含!



0 0