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次申請空間時斷點。

因此,你須要從新運行一遍程序 。(只要流程同樣,內存申請順序確定是同樣的,因此會正確的在須要的地方斷掉。)

注意,以前提示的內存泄露中大括號內的數值就是指的第幾回申請的空間泄露了。

這個時候查看堆棧調用 ,便可知道究竟是在哪裏申請了內存可是忘記釋放掉了。而後將這塊內存在合適的時候釋放掉就好了。

相關文章
相關標籤/搜索