c++大量的手動分配、**記憶體是存在風險的,很有可能因為我們的操作不當導致記憶體洩露的問題。
介紹一種在debug模式下測試記憶體洩露的方法。
先在檔案的開頭加上如下**,切記順序不可以改變。
#define _crtdbg_map_alloc
#include
#include
第一行的巨集,是實現一些記憶體分配函式向debug模式的對映。
接下來,對new做乙個重定義。
#define new_with_memory_lear_checking new(_normal_block,__file__,__line__)
#define new new_with_memory_lear_checking
這裡的new採用的是vc++對operator new的乙個過載,在< vcruntime_new_debug.h>定義。
完成上邊的兩步後,程式中new和delete**的過程中便被vc++監視了,在程式退出的地方呼叫以下函式檢測記憶體洩露。
_crtdumpmemoryleaks();
函式將顯示當前記憶體洩露,也就是程式執行到此行**時的記憶體洩露,所有未摧毀的物件都會報出記憶體洩露,因此這個函式盡量放在後面。
舉個例子:
vc++的編譯器cl.exe在delete後會將記憶體置為0xcdcd防止再次利用,這是程式結束時p進行**。
_crtsetdbgflag ( _crtdbg_alloc_mem_df | _crtdbg_leak_check_df ),這樣無論程式何時終止,都會在終止前呼叫_crtdumpmemoryleaks()。
查詢洩露技巧 : 使用_crtsetbreakalloc(long lbreakalloc ),函式引數為記憶體分配的次數。於是讓程式自動在洩露處進入斷點,可以在_crtsetdbgflag後面新增函式_crtsetbreakalloc(18); 然後除錯程式時,程式自動中斷在第18次分配記憶體的時的crt**處,然後只要通過檢視呼叫堆疊就可以輕鬆看到之前的洩露的**了 。
也可以在某時刻設定檢查點,獲取當時記憶體狀態的快照,比較不同時刻記憶體狀態的差異。
1.在關鍵帶你對應用程式的記憶體狀態拍快照。crt庫提供一種結構型別_crtmemstate,可以儲存記憶體狀態的快照。
_crtmemstate s1, s2, s3;
2.若要在給定點對記憶體狀態拍快照,向_crtmemcheckpoin函式傳遞_crtmemcheckpoint函式傳遞_crtmemstate結構。該函式用當前記憶體狀態的快照填充此結構。
_crtmemcheckpoint(&s1);
3.通過向_crtmemdumpstatistics函式傳遞_crtmemstate結構,可以在任意點輸出當前記憶體的狀態。
_crtmemdumpstatistics(&s1);
4.確定**中部分**發生記憶體洩露,可以在該部分之前和之後對記憶體狀態拍快照,然後使用_crtmemdifference比較這兩個狀態。
_crtmemcheckpoint(&s1);
_crtmemcheckpoint(&s2);
if(_crtmemdifference(&s3, &s1, &s2))
_crtmemdumpstatistics(&s3);
比較s1和s2的記憶體狀態,生成這兩個狀態之間差異的結果s3。
舉個例子:
#define _crtdbg_map_alloc //必須放在#include之前
#include
#include
#include
#ifdef _debug //過載new
#define new new(_normal_block, __file__, __line__)
#endif
using
namespace
std;
int main(int argc,char** argv)
C 記憶體洩露如何檢測?
1.檢查是否存在記憶體洩露 2.檢查 出現記憶體洩露 檢查記憶體洩露不能僅僅靠工具,需要了解 的框架。即使檢查出結果顯示出現記憶體洩露,那也有可能是正常的,具體看你的意圖了,如果 是自己寫得那應該不成問題。如把 new 壓入list中。list在其他地方remove然後delete。所以解決記憶體洩...
記憶體洩露檢測
c 中檢測記憶體洩漏可以引入系統定義的巨集來檢視,內存在哪個位置洩漏 檔案開始處加入下列定義 define crtdbg map alloc include include 程式退出時加入以下函式 crtdumpmemoryleaks 如果有洩漏會顯示 記憶體洩漏是程式設計中常常見到的乙個問題,我所...
檢測記憶體洩露
程式結束時,作業系統會 程式占用的資源.但是,只要程式還在執行,如果不進行清理,資源最終可能被耗盡.1.vc記憶體洩露檢查工具 visual leak detector 現在已知的最新有2.0版本的,使方法不詳。使用 visual leak detector 2.2.3 在vs工程的linker i...