C 的記憶體洩漏檢測

2022-05-06 19:48:12 字數 1564 閱讀 2885

c++大量的手動分配、**記憶體是存在風險的,也許乙個函式中一小塊記憶體洩漏被重複放大之後,最後掏空記憶體。

這裡介紹一種在debug模式下測試記憶體洩漏的方法。

首先在檔案的開頭以確定的順序寫下這段**:

1

#define _crtdbg_map_alloc

2 #include 3 #include

第1行定義了巨集,實現一些記憶體分配函式向debug模式的對映。

開啟我們可以找到這麼一段**:

可以看到,定義了_debug情況下,定義_crtdbg_map_alloc會將函式對映為_dbg的版本。

第二個步驟,對new做乙個重定義

1

#define new_with_memory_leak_checking new(_normal_block,__file__,__line__)

2#define new new_with_memory_leak_checking

這裡new採用的是vc++對operator new的乙個過載,可以在中找到,這裡不多講了。

完成以上兩步之後,程式中new和delete**的過程便被vc++監視了,在程式退出的地方採用

1 _crtdumpmemoryleaks();
便可以在「輸出」視窗檢視報告了。

舉個栗子

這裡還有一點,vc++的編譯器cl.exe在delete之後會將記憶體置為0xcdcd防止再次利用,這裡顯然是程式結束時對p進行了**。

此外,還要介紹乙個new的玩法。

placement new在new後邊跟了括號,這會和上面提到的vc++過載的new衝突,那麼怎麼避免,在其他地方巨集定義了新的new而和placement new衝突的情況?

相信大家一定見過像下面的**

1

#pragma push_macro("new")

2#undef new3//

using the raw new

4#pragma pop_macro("new")

#pragma push/pop_macro將巨集定義名壓/彈棧,這裡現將巨集new壓棧,保留原來的定義,之後取消定義,使用原生的new,使用完畢後彈棧恢復巨集定義。

以上是我介紹的對new出來的記憶體進行洩漏檢測的簡單方法,以及延伸出的一點常用技巧。

感謝閱讀

C 記憶體洩漏檢測

include stdafx.h ifdef debug define debug new new normal block,file line 重新定義new用於記憶體洩漏檢測時輸出行號 define debug malloc s malloc dbg s,normal block,file li...

C 記憶體洩漏檢測

今天寫乙個程式突然想檢測一下是否有記憶體洩漏,於是上網查了一下,大多數都是一種方法。只是實現略有不同,記錄如下。在你想檢測的地方都必須包含 define crtdbg map alloc include include 在程式末尾加上 crtdumpmemoryleaks debug除錯後,如果有記...

記憶體洩漏檢測

一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般 最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的 reboot才會...