微软提供了在debug模式下查泄漏的方法,主要包括_CrtSetDbgFlag、_CrtDumpMemoryLeaks、_CrtSetBreakAlloc这三个函数。_CrtSetDbgFlag用于设置一些标志,具体参靠MSDN,查泄漏的话通常是
_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
_CrtDumpMemoryLeaks放在程序最后,比如main()的最后一行,输出有关泄漏的报告。这里需要注意的是,有些内存的释放会在退出main函数体后。举个例子,比如有个类在构造函数做了内存申请,在析构函数做的释放。如果这个类的实例是静态的或者是main()的函数变量,则在_CrtDumpMemoryLeaks运行时,这部分内存尚未释放。此时则会报告有泄漏。
泄漏报告中的泄漏内存块都有编号,可以用_CrtSetBreakAlloc(编号)来定位该内存申请,程序运行时会在申请该编号内存块时中断。同样,需要考虑该内存申请的实际发生与_CrtSetBreakAlloc的顺序问题。如果_CrtSetBreakAlloc在后,则不会产生中断。所以如果涉及到某些全局或静态变量相关的内存申请的定位,需要采取一些技巧,比如下面的方法:
#pragma once
#include <crtdbg.h>
#ifdef _DEBUG
#pragma warning(disable:4074) // initializers put in compiler reserved initialization area
#pragma init_seg(compiler) // global objects in this file get constructed very early on
struct CrtBreakAllocSetter {
CrtBreakAllocSetter() {
_CrtSetBreakAlloc(151); // 内存申请断点
}
};
CrtBreakAllocSetter g_crtBreakAllocSetter;
#endif //_DEBUG
以上是某个头文件里的定义。在你的main()函数的cpp文件里包含它就行了。