c 記憶體洩露檢測

2021-09-02 19:21:52 字數 1815 閱讀 2876

vs平台下提供了crt庫檢測和識別記憶體洩漏的有效方法。

原理大致如下:記憶體分配要通過crt在執行時實現,只要在分配記憶體和釋放記憶體時分別做好記錄,程式結束時對比分配記憶體和釋放記憶體的記錄就可以確定是不是有記憶體洩漏。

1. 在vs中使用時,需加上

#define _crtdbg_map_alloc

#include

crtdbg.h的作用是將malloc和free函式對映到它們的除錯版本_malloc_dbg和_free_dbg,這兩個函式將跟蹤記憶體分配和釋放(在debug版本中有效)

若跟蹤由new運算子造成的記憶體分配,在需加上

#ifdef _debug //過載new  

#define new  new(_normal_block, __file__, __line__)    

#endif

2.運用_crtdumpmemoryleaks()函式檢測記憶體洩露

函式將顯示當前記憶體洩露,也就是說程式執行到此行**時的記憶體洩露,所有未銷毀的物件都會報出記憶體洩露,因此要讓這個函式盡量放到最後。呼叫_crtdumpmemoryleaks()來檢測記憶體洩露,如果程式可能在多個地方終止,必須在多個地方呼叫這個函式,這樣比較麻煩,可以在程式起始位置呼叫

_crtsetdbgflag ( _crtdbg_alloc_mem_df | _crtdbg_leak_check_df ),這樣無論程式何時終止,都會在終止前呼叫_crtdumpmemoryleaks()。

查詢洩露技巧 : 使用_crtsetbreakalloc(long lbreakalloc ),函式引數為記憶體分配的次數。於是讓程式自動在洩露處進入斷點,可以在_crtsetdbgflag後面新增函式_crtsetbreakalloc(18); 然後除錯程式時,程式自動中斷在第18次分配記憶體的時的crt**處,然後只要通過檢視呼叫堆疊就可以輕鬆看到之前的洩露的**了 。

3.還可以在某時刻設定檢查點,獲取當時記憶體狀態的快照。比較不同時刻記憶體狀態的差異。

3.1定位記憶體洩漏的另一種技術涉及在關鍵點對應用程式的記憶體狀態拍快照。 crt 庫提供一種結構型別 _crtmemstate ,您可用它儲存記憶體狀態的快照:

_crtmemstate s1, s2, s3;

3.2若要在給定點對記憶體狀態拍快照,請向 _crtmemcheckpoint 函式傳遞 _crtmemstate 結構。 該函式用當前記憶體狀態的快照填充此結構:

_crtmemcheckpoint( &s1 );

3.3通過向 _crtmemdumpstatistics 函式傳遞 _crtmemstate 結構,可以在任意點輸出當前記憶體的狀態:

_crtmemdumpstatistics( &s1 );

3.4若要確定**中某一部分是否發生了記憶體洩漏,可以在該部分之前和之後對記憶體狀態拍快照,然後使用 _crtmemdifference 比較這兩個狀態:

_crtmemcheckpoint( &s1 );

// memory allocations take place here

_crtmemcheckpoint( &s2 );

if ( _crtmemdifference( &s3, &s1, &s2) )

_crtmemdumpstatistics( &s3 );

顧名思義,_crtmemdifference 比較兩個記憶體狀態(s1 和 s2),生成這兩個狀態之間差異的結果(s3)。

在程式的開始和結尾放置 _crtmemcheckpoint 呼叫,並使用_crtmemdifference 比較結果,是檢查記憶體洩漏的另一種方法。 如果檢測到洩漏,則可以使用 _crtmemcheckpoint 呼叫通過二進位制搜尋技術來劃分程式和定位洩漏。

除錯**:

C 檢測記憶體洩露

p new int p指標修改,原來申請記憶體的位址沒有記錄下來,於是無法釋放 下面介紹如何檢查記憶體洩漏 1.包含標頭檔案和定義 define crtdbg map alloc 並非絕對需要該語句,但如果有該語句,列印出來的是檔名和行數等更加直觀的資訊 include include 1 incl...

C 記憶體洩露檢測

記憶體檢測相關命令 valgrind tool memcheck leak check full undef value errors yes ql circle svr2 id 20000 tcp 192.168.1.55 8000 svr 192.168.1.55 8015 valgrind t...

c 記憶體洩露檢測

當我們進行c 程式設計的時候經常遇到的乙個問題是記憶體洩露,尤其在進行乙個大型的專案的時候,可能會用到幾十個類,稍加不小心造成記憶體洩露,一般常用以下兩種方法 方法一 ifdef debug define new new normal block,file line endif define crt...