随笔 - 85  文章 - 47  trackbacks - 0

常用链接

随笔分类

随笔档案

搜索

  •  

最新评论

1. 启用内存泄漏检测

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

当退出程序位置固定时,用:
_CrtDumpMemoryLeaks();

定义了_CRTDBG_MAP_ALLOC 时,会显示内存块类型和内存块分配编号(在大括号内)。

当退出位置不固定时,用:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

该语句在程序退出时自动调用 _CrtDumpMemoryLeaks。必须同时设置 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_ALLOC_MEM_DF 两个位域。

2. 内存块类型

“普通块”是由程序分配的普通内存。
“客户端块”是由 MFC 程序用于需要析构函数的对象的特殊类型内存块。MFC new 操作根据创建对象的需要创建普通块或客户端块。
“CRT 块”是由 CRT 库为自己使用而分配的内存块。CRT 库处理这些块的释放,因此您不大可能在内存泄漏报告中看到这些块,除非出现严重错误(例如 CRT 库损坏)。

3. 内存泄露定位 - 在内存分配编号上设置断点

先通过_CrtDumpMemoryLeaks查到泄露的内存块分配号n,然后添加语句

_CrtSetBreakAlloc(n);

Debug程序运行后,将自动断点至分配处

4. 内存状态比较

_CrtMemCheckpoint( &s1 );
// memory allocations take place here
_CrtMemCheckpoint( &s2 );

if ( _CrtMemDifference( &s3, &s1, &s2) )
   _CrtMemDumpStatistics( &s3 );

5. CRT内存泄露误报

在某些情况下,_CrtDumpMemoryLeaks 可能给出错误的内存泄漏指示。如果使用将内部分配标记为 _NORMAL_BLOCK 而不是 _CRT_BLOCK 或 _CLIENT_BLOCK 的库,则可能发生这种情况。其结果是,_CrtDumpMemoryLeaks 无法区分用户分配和内部库分配。如果库分配的全局析构函数在您调用 _CrtDumpMemoryLeaks 的位置之后运行,则每个内部库分配都被作为内存泄漏进行报告。Visual Studio .NET 之前的早期版本的标准模板库会导致 _CrtDumpMemoryLeaks 报告这样的错误指示,但在最新版本中此问题已经得到解决。
posted on 2008-05-10 04:40 w2001 阅读(685) 评论(0)  编辑 收藏 引用 所属分类: C/C++语言

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理