检测内存泄露
VS的C Run-Time Libraries支持内存调试。对于MFC程序,VS自动添加
#ifdef _DEBUG #define new DEBUG_NEW #endif
在cpp文件开头,出现内存泄露时就能报告相应的错误信息。
对于非MFC程序,主要工具是调试器和C Run-Time Libraries的debug heap函数。
要使用这些函数,需设置如下步骤:
- 使用程序调试版本,C运行时刻函数库也选择调试版本;
- 在程序中添加设置代码,stdafx.h开头是个合适的位置。
#ifdef _DEBUG #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
crtdbg.h:通过include此文件将 malloc 和 new 替换为他们的debug版本, _malloc_dbg和 _free_dbg,跟踪内存的分配和释放。
_CRTDBG_MAP_ALLOC:将CRT的heap函数替换为对应的debug版本,设置此参数能使内存泄露检查提供更多信息。
- 在程序开头添加:
#ifdef _DEBUG _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF // 启动堆分配检查 | _CRTDBG_LEAK_CHECK_DF ); // 程序结束时__CrtDumpMemoryLeaks自动调用 #endif
附相关链接,详细叙述了调试堆方法:1、MSDN中关于检测内存泄露的说明:http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=VS.80%29.aspx
2、CRT调试堆:http://blog.csdn.net/ugg/article/details/1585639