VS2008中捕获内存泄露(转)

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

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

 

 

  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 );  

 

 

 

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

注意!重点来了。debug

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

 

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

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

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

 

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.

 

 

 

那么, 若是出现了这种状况, 实际上是根本没法知道哪里出了问题。那么这个时候该怎么办呢?内存

这个时候须要使用这个函数。get

 

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

 

 

 

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

因此,你须要从新运行一遍程序 。(只要流程同样,内存申请顺序确定是同样的,因此会正确的在须要的地方断掉。)

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

这个时候查看堆栈调用 ,便可知道究竟是在哪里申请了内存可是忘记释放掉了。而后将这块内存在合适的时候释放掉就好了。

相关文章
相关标签/搜索