VS2008检测内存泄露

内存泄露十分讨厌,捕获内存泄露更加令人厌烦……

其实,VS本身就有内存泄露的检测机制。只需做以下操作即可开启。(同时必须在debug模式 下运行程序并且正常流程退出 )

 

  1. // 在入口函数cpp中添加以下定义和头文件   
  2. #define CRTDBG_MAP_ALLOC   
  3. #include <stdlib.h>   
  4. #include <crtdbg.h>   
  5. // 在入口函数一开始添加以下代码   
  6. _CrtDumpMemoryLeaks();  
  7.     _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );  
[cpp]  view plain copy
  1. // 在入口函数cpp中添加以下定义和头文件  
  2. #define CRTDBG_MAP_ALLOC  
  3. #include <stdlib.h>  
  4. #include <crtdbg.h>  
  5. // 在入口函数一开始添加以下代码  
  6. _CrtDumpMemoryLeaks();  
  7.     _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );  

然后在 正常流程退出 程序后, 就会在输出窗口显示出内存泄露的信息了。

注意!重点来了。

虽然VS检测出来了哪里有了内存泄露, 但是有可能你得到的有效信息只有两个 (如下)

 

1. 未释放的内存大小。(绿色部分 )

2. 这块内存是程序中总计第几个被申请的。(蓝色部分 )。

3. 而申请空间所在代码的位置可能不会被显示(删除线部分 )。

Detected memory leaks! Dumping objects -> C:/PROGRAM FILES/VISUAL STUDIO/MyProjects/leaktest/leaktest.cpp(20) : {18 } 
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

那么, 如果出现了这种情况, 其实是根本无法知道哪里出了问题。那么这个时候该怎么办呢?

这个时候需要使用这个函数。

  1. //num就是刚刚检测出来的内存泄露的地方大括号内的数字   
  2. _CrtSetBreakAlloc(num);  
[cpp]  view plain copy
  1. //num就是刚刚检测出来的内存泄露的地方大括号内的数字  
  2. _CrtSetBreakAlloc(num);  

这个函数的作用是,在你运行程序的时候,会在第num次申请空间时断点。

所以,你需要重新运行一遍程序 。(只要流程一样,内存申请顺序肯定是一样的,所以会正确的在需要的地方断掉。)

注意,之前提示的内存泄露中大括号内的数值就是指的第几次申请的空间泄露了。

这个时候查看堆栈调用 ,即可知道到底是在哪里申请了内存但是忘记释放掉了。然后将这块内存在合适的时候释放掉就行了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值