对于如何快速找到和定位内存泄漏的问题,网上已经有很多相关的内容。在这里也就做一个总结。
1.如何发现内存泄漏。
VC中检测内存泄漏的基本工具是调试器和 CRT 调试堆函数。为了使用调试堆函数,必须在要调试的程序中添加下面的语句:
- #define _CRTDBG_MAP_ALLOC
- #include<stdlib.h>
- #include<crtdbg.h>
必须保证上面声明的顺序,如果改变了顺序,可能不能正常工作。寻找内存泄漏的原理只是改变了内存分配的接口,即在DEBUG版中,使用<crtdbg.h>的_malloc_dbg和_free_dbg取代标准的malloc和free函数。由于它们可以跟踪内存的分配和释放,从而可以检测动态分配的内存是否被释放。但是这只会在DEBUG版本中发生(当#define _DEBUG的时候),而Release版本仍使用标准的malloc和free功能。
#define _CRTDBG_MAP_ALLOC表示使用CRT堆函数的相应的DEBUG版本。这个定义不是必须的,但是没有它,内存泄漏报告中的信息不是很详细。
一旦你已经添加了刚才的声明,你就能够通过在程序return前加入下面的代码来报告内存泄漏信息:
- _CrtDumpMemoryLeaks();
例如:
- #define _CRTDBG_MAP_ALLOC
- #include<stdlib.h>
- #include<crtdbg.h> //依次加上以上语句
- #include <iostream>
- using namespace std;
- int main()
- {
- char* a = new char[2];
- a[0] = 'A';
- a[1] = 'B';
- //delete[] a; //故意不delete
- _CrtDumpMemoryLeaks(); //检测并报告内存泄漏
- return 0;
- }
当在DEBUG模式下运行程序时,在Output窗口的Debug页会显示如下内存泄漏的信息:
Detected memory leaks!
Dumping objects ->
{64} normal block at 0x00396A58, 2 bytes long.
Data: <AB> 41 42
Object dump complete.
Dumping objects ->
{64} normal block at 0x00396A58, 2 bytes long.
Data: <AB> 41 42
Object dump complete.