標籤:
記憶體泄露十分討厭,捕獲記憶體泄露更加令人厭煩……
其實,VS本身就有記憶體泄露的檢測機制。只需做以下操作即可開啟。(同時必須在debug模式 下運行程式並且以 正常流程退出 )
view plaincopy to clipboard
- // 在入口函數cpp中添加以下定義和標頭檔
- #define CRTDBG_MAP_ALLOC
- #include <stdlib.h>
- #include <crtdbg.h>
- // 在入口函數一開始添加以下代碼
- _CrtDumpMemoryLeaks();
- _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
[cpp] view plaincopy
- // 在入口函數cpp中添加以下定義和標頭檔
- #define CRTDBG_MAP_ALLOC
- #include <stdlib.h>
- #include <crtdbg.h>
- // 在入口函數一開始添加以下代碼
- _CrtDumpMemoryLeaks();
- _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 CDObject dump complete.
那麼, 如果出現了這種情況, 其實是根本無法知道哪裡出了問題。那麼這個時候該怎麼辦呢?
這個時候需要使用這個函數。
view plaincopy to clipboard
- //num就是剛剛檢測出來的記憶體泄露的地方大括弧內的數字
- _CrtSetBreakAlloc(num);
[cpp] view plaincopy
- //num就是剛剛檢測出來的記憶體泄露的地方大括弧內的數字
- _CrtSetBreakAlloc(num);
這個函數的作用是,在你運行程式的時候,會在第num次申請空間時斷點。
所以,你需要重新運行一遍程式 。(只要流程一樣,記憶體申請順序肯定是一樣的,所以會正確的在需要的地方斷掉。)
注意,之前提示的記憶體泄露中大括弧內的數值就是指的第幾次申請的空間泄露了。
這個時候查看堆棧調用 ,即可知道到底是在哪裡申請了記憶體但是忘記釋放掉了。然後將這塊記憶體在合適的時候釋放掉就行了。
VS2008中捕獲記憶體泄露(轉)