标签:内存泄露 visual studio c++
#define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h>其中#define 语句将 CRT 堆函数的基础版本映射到对应的调试版本。 如果省略 #define 语句,内存泄漏转储将有所简化。
使用这些语句启用调试堆函数之后,可以在某个应用程序退出点之前设置一个对 _CrtDumpMemoryLeaks 的调用,以便在应用程序退出时显示内存泄漏报告:_CrtDumpMemoryLeaks();如果要为程序添加退出点时检测内存泄露,则可以通过设置调试选项来设置,而不需要在每个退出点自己添加函数_CrtDumpMemoryLeaks的调用:_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
默认情况下,输出的调试信息会在调试窗口,当然,你可以通过_CrtSetReportMode来自定义输出位置。
定位内存泄漏的另一种技术涉及在关键点对应用程序的内存状态拍快照。 若要为应用程序中给定点的内存状态拍快照,创建 _CrtMemState 结构,将它传递给 _CrtMemCheckpoint 函数:_CrtMemState s1; _CrtMemCheckpoint( &s1 );_CrtMemCheckpoint 会将当前内存状态填充在该结构中。
如果要查看输出 _CrtMemState 结构的内容,可使用_ CrtMemDumpStatistics 函数:_CrtMemDumpStatistics( &s1 ); //_ CrtMemDumpStatistics 输出内存状态转储,如下所示: // 0 bytes in 0 Free Blocks. // 0 bytes in 0 Normal Blocks. // 3071 bytes in 16 CRT Blocks. // 0 bytes in 0 Ignore Blocks. // 0 bytes in 0 Client Blocks. // Largest number used: 3071 bytes. // Total allocations: 3764 bytes.
若要确定在某个代码部分中是否发生了内存泄漏,可以对这部分之前和之后的内存状态拍快照,然后使用 _ CrtMemDifference 比较两个状态:
_CrtMemCheckpoint( &s1 ); // memory allocations take place here _CrtMemCheckpoint( &s2 ); if ( _CrtMemDifference( &s3, &s1, &s2) ) { _CrtMemDumpStatistics( &s3 ); }_CrtMemDifference比较内存状态 s1 和 s2,在 (s3) 中返回结果,即 s1 与 s2 的差异。
寻找内存泄漏的一个方法是,首先在应用程序的开头和结尾部分放置 _CrtMemCheckpoint 调用,然后使用 _CrtMemDifference 比较两个结果。 如果 _CrtMemDifference 显示有内存泄漏,通过添加更多 _CrtMemCheckpoint 调用来使用二进制搜索划分程序,直至找到泄漏源。
标签:内存泄露 visual studio c++
原文地址:http://blog.csdn.net/jiadebin890724/article/details/25330557