不少网友写了关于MFC内存检测机制的使用方法,如下面几篇文章写得很好,参考下面几篇文章:
内存管理:_CrtDumpMemoryLeaks和_CrtSetBreakAlloc
MFC内存泄露检测
VC使用CRT调试功能来检测内存泄漏
检测C++的内存泄漏(win7 64 vs2010)
不过有一个问题很多网友都没有提到,那就是关于内存泄露的信息输出的内容是否包含.cpp文件名路径问题.
利用_CrtDumpMemoryLeaks()可以输出内存泄露信息,在程序文件d:\svn\trunk\code\test\testbase.cpp中某函数有这么一行:
char* xx = new char[10];
strcpy(xx, "123456789");
然后在程序调用该函数,在程序结束前调用_CrtDumpMemoryLeaks();输出信息如下:
Detected memory leaks!
Dumping objects ->
{671} normal block at 0x00992FE8, 10 bytes long.
Data: <123456789 > 31 32 33 34 35 36 37 38 39 00
请注意这个输出信息,并没有指出是哪个源程序文件的哪一行发生泄露,MSDN上说应用程序定义_CRTDBG_MAP_ALLOC宏就可以输出该信息,我在文件testbase.cpp定义了该宏,如下所示:
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>
#endif
但事实证明并不是这样,我发现输出的内容仍然没有"d:\svn\trunk\code\test\testbase.cpp".
后来经过测试发现,testbase.cpp必须有这样的定义:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
然后在程序结束前调用_CrtDumpMemoryLeaks();输出信息如下:
Dumping objects ->
d:\svn\trunk\code\test\testbase.cpp(146) : {671} normal block at 0x00CD2FE8, 10 bytes long.
Data: <123456789 > 31 32 33 34 35 36 37 38 39 00
结果是正确的,输出的内容指出了是哪个源程序文件的哪一行发生泄露.
可是这有产生另外一个问题,那就是_CRTDBG_MAP_ALLOC似乎没有起任何作用,不知道为什么.如果哪位网友知道这个原因,请不吝赐教,不胜感激.