C++内存泄露的检测(一)
一
Visual Studio 调试器和 C 运行时 (CRT) 库为我们提供了检测和识别内存泄漏的有效方法。主要使用函数:_CrtDumpMemoryLeaks();
二 实例
1 #define _CRTDBG_MAP_ALLOC //输出更详细的report 2 #include <stdlib.h> 3 #include <crtdbg.h> 4 //以上的内容必须放在其他include的前面 5 6 #include <vector> 7 8 class MyClass 9 { 10 private: 11 int *p; 12 public: 13 MyClass() 14 { 15 if(p != NULL) 16 { 17 p = new int(0); 18 } 19 } 20 ~MyClass() 21 { 22 if(p != NULL) 23 { 24 delete p; 25 p = NULL; 26 } 27 } 28 }; 29 30 int _tmain(int argc, _TCHAR* argv[]) 31 { 32 int *i = NULL; // better for read 33 i = new int(0); 34 int *&y = i; // pointer's reference 35 36 MyClass *pMyClass = new MyClass(); 37 38 std::vector<MyClass*> myClasses; 39 myClasses.push_back(new MyClass()); 40 myClasses.push_back(new MyClass()); 41 42 _CrtDumpMemoryLeaks(); 43 return 0; 44 }
三说明
1)只对debug模有用,可以在程序运行后在vs的ide的output的最后看到泄露的检测结果。
2)可以检测系统类型,自定义类型和stl 容器。
3)#define _CRTDBG_MAP_ALLOC //包含该宏定义输出更详细的report
#include <stdlib.h>
#include <crtdbg.h>
//以上的内容必须放在其他include的前面,否则可能使上面定义的宏失效。
4)如果程序有统一的退出口,则在退出时调用_CrtDumpMemoryLeaks();
5)如果程序有多个出口,则可以在程序开始处包含下面的调用:_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );这条语句无论程序在什么地方退出都会自动调用 _CrtDumpMemoryLeaks。
四 更多(更多的API和demo的下载)
http://msdn2.microsoft.com/zh-cn/library/fxszt639(VS.80).aspx