如何用VS工具检测内存泄露

以下所讨论的函数及宏都在 crtdbg.h 头文件 中 

一、_CrtDumpMemoryLeaks() 函数

 
用法,在程序退出之前调用 _CrtDumpMemoryLeaks() 函数,会在 VS 窗口输出内存泄露的块
eg:
#include <stdio.h>
#include <stdlib.h>
#include <crtdbg.h>
//在入口函数中包含 _CrtDumpMemoryLeaks();
//即可检测到内存泄露
class Fei
{
public:
int handle;
void show( )
{
printf( "it's here %d!", handle );
}
};
 
//以如下测试函数为例:
int main()
{
auto f = new Fei;
char* pChars = new char[10];
//delete f;
_CrtDumpMemoryLeaks(); // 只能侦测出此函数所在退出点的内存泄露
 
return 0;
}
输出窗口显示:
Detected memory leaks!
Dumping objects ->
{75} normal block at 0x00EE9678, 10 bytes long.
 Data: <          > CD CD CD CD CD CD CD CD CD CD
{74} normal block at 0x00EE9638, 4 bytes long.
 Data: <    > CD CD CD CD
Object dump complete.
 
其中:{N} normal block at 0x00EE9678, 10 bytes long.,括号内的红色字显示的是在第 N 次分配内存时产生的泄露,根据这个可以用
_CrtSetBreakAlloc( N) //---- 此函数的原型为:_CrtSetBreakAlloc(long lBreakAlloc );
 
这个函数来下断,会在第 N 次分配内存时直接断下。
 
但是,程序并不是总只有一个退出点的,不可能在所以的程序退出点都埋下 _CrtDumpMemoryLeaks() 函数,由此聪明的程序员门修炼出了 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 函数。
 

二、不问程序退出点,直接暴力显示所有内存泄露 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

把此函数放在 main 函数的开头即可。
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
 
表现在代码层为
//以如下测试函数为例:
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); // 只要在main函数调用一次,不管哪个退出点,都可侦测出
char* pChars = new char[10];
 
return 0;
}
 

三、还在为想轻易的看到某变量值而凡心么?_RPTn 宏 来帮你解烦忧

在调试状态下让win程在输出窗口中显示调试信息,可以用_RPTn 宏n为显示参数比如_RPT0(_CRT_WARN,"text");
 
  _RPT1(_CRT_WARN,"%d", iTest); _RPT2(_CRT_WARN,"%d,%f", iTest, fTest);...有几个参数就是_RPT几,依次类推
代码层:
_RPT1( _CRT_WARN, "%d\n", 500 );
 

四、_CrtSetBreakAlloc(long lBreakAlloc );大显伸手,捉奸成双,定位内存泄露

 
代码:
_CrtSetBreakAlloc( 74 );
其它详见第一条

 

posted @ 2016-04-12 10:04  -刀狂剑痴-  阅读(1424)  评论(0编辑  收藏  举报