内存泄露位置检测

本文介绍如何在Visual Studio中定位内存泄漏的具体位置。通过定义宏并包含必要的头文件,配合使用_CrtDumpMemoryLeaks()函数,可以有效检测内存泄漏。此外,文章还介绍了如何利用_CrtSetBreakAlloc()进行更精确的泄漏源定位。

内存分配有两种方式,malloc 和 new,C++的new完全可以代替C语音的malloc。

平时在vs下面,在程序退出的时候也只能看见内存泄露的提示,不能指定具体文件及位置。那么,怎么能找到所在文件和位置呢?

首先,声明如下:

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

 

然后,在程序退出时调用_CrtDumpMemoryLeaks();

 

其实这两个步骤就可以用了。

但是,对于同一位置的重复内存申请,需要跟踪哪次内存在泄露,这时,可以用

_CrtSetBreakAlloc(N);

或者:

设置项目属性“在静态库中使用 MFC”;然后在watch(监视)窗口中输入

_crtBreakAlloc ,在Value(值)里面输入整数(N),那么程序将在第N次申请内存时中断。这个N取决于泄露的位置,如:

d:/vs8test/vs8testdlg.cpp(2077) : {84} normal block at 0x00FC6B70, 100 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

大括号中的84就是N。

 

我在MS8中测试,malloc 泄露检测有问题。但这不影响,因为开始也说了,new完全可以替代malloc。

测试时我还发现

_CrtSetDbgFlag( _CRTDBG_LEAK_CHECK_DF| _CRTDBG_CHECK_ALWAYS_DF);或者

_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG  | _CRTDBG_LEAK_CHECK_DF| _CRTDBG_CHECK_ALWAYS_DF);

 

也不好用。

 

 

内存快照,用于获取内存的状态:

_CrtMemState s1;   // _CrtMemState

_CrtMemCheckpoint( &s1 );

 

_CrtMemDumpStatistics( &s1 ); //用来输出s1的内容

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值