記憶體洩露十分讨厭,捕獲記憶體洩露更加令人厭煩……
其實,VS本身就有記憶體洩露的檢測機制。隻需做以下操作即可開啟。(同時必須在debug模式 下運作程式并且以 正常流程退出 )
// 在入口函數cpp中添加以下定義和頭檔案
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
// 在入口函數一開始添加以下代碼
_CrtDumpMemoryLeaks();
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
// 在入口函數cpp中添加以下定義和頭檔案
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
// 在入口函數一開始添加以下代碼
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
然後在以 正常流程退出 程式後, 就會在輸出視窗顯示出記憶體洩露的資訊了。
注意!重點來了。
雖然VS檢測出來了哪裡有了記憶體洩露, 但是有可能你得到的有效資訊隻有兩個 (如下)
1. 未釋放的記憶體大小。(綠色部分 )
2. 這塊記憶體是程式中總計第幾個被申請的。(藍色部分 )。
3. 而申請空間所在代碼的位置可能不會被顯示(删除線部分 )。
那麼, 如果出現了這種情況, 其實是根本無法知道哪裡出了問題。那麼這個時候該怎麼辦呢?
這個時候需要使用這個函數。
//num就是剛剛檢測出來的記憶體洩露的地方大括号内的數字
_CrtSetBreakAlloc(num);
//num就是剛剛檢測出來的記憶體洩露的地方大括号内的數字
這個函數的作用是,在你運作程式的時候,會在第num次申請空間時斷點。
是以,你需要重新運作一遍程式 。(隻要流程一樣,記憶體申請順序肯定是一樣的,是以會正确的在需要的地方斷掉。)
注意,之前提示的記憶體洩露中大括号内的數值就是指的第幾次申請的空間洩露了。
這個時候檢視堆棧調用 ,即可知道到底是在哪裡申請了記憶體但是忘記釋放掉了。然後将這塊記憶體在合适的時候釋放掉就行了。
本文轉自 傑思 51CTO部落格,原文連結:http://blog.51cto.com/12700807/1916869