如何用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 );
其它详见第一条