首先,我们要清楚,VC编译器可以将跟踪内存分配情况的代码嵌入到目标程序的能力,这些代码的头文件就是crtdbg.h。当你使用MFC时,将它include之后,只需在程序刚开始执行的地方调用_CrtDumpMemoryLeaks(),调试一次程序,内存泄露的情况就会输出到“输出”窗口,详情见http://blog.csdn.net/HeavenMonkey/archive/2008/05/24/2476411.aspx。
如果你的程序没有使用MFC,也不想使用它,那么_CrtDumpMemoryLeaks()也可以用,但是“输出”窗口中的内存泄露条目是不支持双击定位的,也就是说,你只知道泄露了,但不能是哪一行代码引起的,这样达不到调试目标。
其实,crtdbg.h是不依赖于MFC的,只是对MFC支持很好。在这种情况下,可以采用以下方法定位泄露内存语句:
1)程序开始处,加入:
int nFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
nFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(nFlag);
以上三行使嵌入的调试线程开启内存分配跟踪,与调用_CrtDumpMemoryLeaks()相似,内存泄露的情况会被输出到“输出”窗口。仔细观察内存泄露的情况,会发现每个内存泄露前面,都有一个{n},n是一个整数,可以看成该信息的id,其实是说程序的第几次内存分配没有回收。
2)在以上三行后面,加入:
_CrtSetBreakAlloc(n);
其中n就是某一个内存泄露的id,调试一下,你会发现,程序停止在某一行,这就是对应该id分配的地方。然后就看你的了,解决它吧!