启用内存泄漏检测

本主题适用于:

 

 

检测内存泄漏的主要工具是调试器和 C 运行库 (CRT) 调试堆函数。

若要启用调试堆函数,请在程序中包括以下语句:

 说明

#include 语句必须采用上文所示顺序。 如果更改了顺序,所使用的函数可能无法正常工作。

 

 

通过包括 crtdbg.h,将 malloc 和 free 函数映射到它们的调试版本,即 _malloc_dbg 和 _free_dbg,这两个函数将跟踪内存分配和释放。 此映射只在调试版本(在其中定义了 _DEBUG)中发生。发布版本使用普通的 malloc 和 free 函数。

#define 语句将 CRT 堆函数的基版本映射到对应的“Debug”版本。 并非绝对需要该语句;但如果没有该语句,内存泄漏转储包含的有用信息将较少。

在添加了上述语句之后,可以通过在程序中包括以下语句(通常应恰好放在程序退出位置之前)来转储内存泄漏信息:

 

_CrtDumpMemoryLeaks();

当在调试器下运行程序时,_CrtDumpMemoryLeaks 将在“输出”窗口中显示内存泄漏信息。 内存泄漏信息如下所示:
 

如果没有使用 #define _CRTDBG_MAP_ALLOC 语句,内存泄漏转储将如下所示:


未定义 _CRTDBG_MAP_ALLOC 时,所显示的会是:

  • 内存分配编号(在大括号内)。

  • 块类型(普通、客户端或 CRT)。

  • 十六进制形式的内存位置。

  • 以字节为单位的块大小。

  • 前 16 字节的内容(亦为十六进制)。

定义了 _CRTDBG_MAP_ALLOC 时,还会显示在其中分配泄漏的内存的文件。 文件名后括号中的数字(本示例中为 20)是该文件中的行号。


转到源文件中分配内存的行

  • “输出”窗口中双击包含文件名和行号的行。

    - 或 -

    “输出”窗口中选择包含文件名和行号的行,然后按 F4。

_CrtSetDbgFlag

如果程序总是在同一位置退出,调用  _CrtDumpMemoryLeaks 将非常容易。 如果程序从多个位置退出,则无需在每个可能退出的位置

放置对

 _CrtDumpMemoryLeaks 的调用,而可以在程序开始处包含以下调用:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
该语句在程序退出时自动调用 _CrtDumpMemoryLeaks 必须同时设置 _CRTDBG_ALLOC_MEM_DF 和 
_CRTDBG_LEAK_CHECK_DF  两个位域,如前面所示。

默认情况下,_CrtDumpMemoryLeaks 将内存泄漏信息转储到“输出”窗口的“调试”窗格,如上所述。 可以使用

 _CrtSetReportMode 重置该设置,以转储到另一位置。

如果使用库,它可以将输出重置到另一位置。 在此情况下,可以使用以下语句将输出位置设置回“输出”窗口:

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值