我使用的是Visual Studio 11 beta,Win7系统。
下面示例程序中通过使用_CrtDumpMemoryLeaks() 或 _CrtSetDbgFlag()来进行内存泄露检测。
当发生内存泄露的时候在debug窗口会给出内存泄露的信息,其中_CrtDumpMemoryLeaks用来需要检测的代码的后面,
_CrtSetDbgFlag() 用在程序的一开始,总的来说_CrtSetDbgFlag() 比较强大一点。
在程序的开头最好加上以下宏定义:
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
这样在debug窗口中会打印出导致产生内存泄露的行。
下面来看程序:(按F5,开始调试,最后在Debug窗口会给出内存泄露信息)
#include <cstdlib>
#include <xdebug>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
int main()
{
// 方法【1】
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
int* leak = new int[10];
//方法【2】
//_CrtDumpMemoryLeaks();
return 0;
}
运行结果:
说明:上图中d:\vs11project\mem_leak_detect\mem_leak_detect\mem_leak_detect_01.cpp(16) : {16} normal block at 0x00176F68, 40 bytes long. 16表示发生内存泄露的行,40表示泄露的大小
这里就顺便说一下前面一片文章(链表合并)中提过的内存泄露论证。在merge()函数中一开始分配的辅助内存空间,初始的时候由mcur 指向该内存区域,随着合并操作的进行 mcur 将不再会指向该快内存区域,导致这块内存区域无法释放。因此使用了全局变量mcur_ 指针来辅助释放。如果不使用该指针的话,使用_CrtSetDbgFlg() 检测就会出现下面的信息:
这里只是对内存泄露检测进行了粗浅的探讨,如果需要更多方式的时候可以由此出发进一步学习和改进。