如何检测非MFC程序的内存泄露?

本文介绍了一种在MFC程序中检测内存泄漏的方法。通过重新定义new操作符,并使用_CrtSetDbgFlag宏来开启内存分配和泄漏检查功能,可以在程序退出时输出详细的内存泄漏信息,包括文件名和行号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在调试MFC程序时,在应用程序入口函数所在的模块(.cpp)加入如下语句:

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

应用程序入口函数中加上如下语句:

_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

程序退出时,如果有内存泄漏,Debug Output窗口会输出类似下面的带原文件名和行号信息:
非MFC程序可以用_CrtDumpMemoryLeaks()函数检测内存泄漏,但无法输出代码行信息:

Detected memory leaks! 
Dumping objects 
-> 
{55} normal block at 0x003710001 bytes long
Data: 
<a> 61 

如何能够显示内存泄漏的代码行呢?方法是重新定义new如下,以便告诉compiler使用debug版本的operator new()方法:

//#define _CRTDBG_MAP_ALLOC //注意这里 
#include<stdlib.h> 
#include
<crtdbg.h>

#ifdef _DEBUG 
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#endif

Detected memory leaks
! 
Dumping objects 
-> 
D:VC_workshop estmemLeak.cpp(
25) : {55} normal block at 0x011C2FD04 bytes long
 Data: 
<    > 07 00 00 00 
Object dump complete.

 相关的CRT源代码位置:

    CRT/SRC/dbgnew.cpp

DCRT库的各个标记

_CRTDBG_ALLOC_MEM_DF :

开启heap分配功能,并使用内存快标识符。这是在默认状态下唯一的一个标记。

_CRTDBG_CHECK_ALWAYS_DF :

检查并验证各个分配地址上的所有内存和释放内存分配请求。打开这个标记能够在任何内存保护和内存覆盖发生时尽可能快地捕捉到他们。

_CRTDBG_CHECK_CRT_DF :

将_CRT_BLOCK内存分配包括到所有的内存泄露检测和状态区别中。通常情况下,除非有一个CRT库函数有问题,否则最好不要打开这个标记。如果打开了这个标记,就会得到各个CRT库内存分配报告。因为直道程序真正结束之前,CRT库必须保证分配了一些内存。而程序结束是在内存泄露报告之后,所以,你将会看到大量关于该内存的假的绝对内存泄露报告。

_CRTDBG_DELAY_FREE_MEM_DF :

不是真正释放内存,而是保留分配的内存块并保留内部的heap列表。该内存被值0xDD覆盖,因此当你在调试器中查看时,就会知道该内存已经释放了。不释放该内存,则使用该标记可以在内存强调条件下测试程序。除此之外,通过确保该内存中的所有置仍旧是0xDD,DCRT库可以检查你确实没有再次访问这个已解除分配的内存块。应始终打开这个标记,但是要切记能够轻易地加倍程序的内存需求,因为分配的能存没有被heap重新使用。

_CRTDBG_LEAK_CHECK_DF :

检查程序末端的内存泄露。打开这个极其有用的标记是必须的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值