VC 記憶體洩露與檢測的一種方法

2022-04-16 09:51:17 字數 1443 閱讀 1232

本文介紹,當vc++或者mfc程式,出現記憶體洩露時,如何快速定位的方法,這種方法有一定的侷限性,在注意事項中會給出的。

當mfc程式出現記憶體洩露時,退出程式時的vs除錯輸出視窗,一般會有如下顯示:

上面顯示了在程式的哪個檔案的哪行語句,發生了記憶體洩露,其中:

: 表示 記憶體分配編號

normal block:表示 記憶體塊型別,有普通塊(普通程式分配)、客戶端塊(分配基於cobject的記憶體)和crt塊(庫函式內部分配)這幾種型別

0x0074a030:以16進製制形式輸出的記憶體位置

40 bytes long: 以位元組為單位的記憶體塊大小

datacd cd ..:記憶體塊前16個位元組的內容,16進製表示。

定位記憶體洩露位置,可以雙擊洩露資訊,也可以在輸出視窗 按f4鍵,跳轉到 出錯行。

在普通vc++程式中,要類似mfc中記憶體檢測的效果,需要做如下操作。

1.  在標頭檔案中,新增  #include

2.  在程式入口最開始處,新增 下面兩句話即可

_crtsetdbgflag ( _crtdbg_alloc_mem_df | _crtdbg_leak_check_df );    //設定除錯堆函式跟蹤分配的方式

//_crtsetbreakalloc();     //這句話,在確實有記憶體洩露的情況下,給 記憶體分配編號

3. 按f5,執行程式,等待程式退出後,在輸出視窗可以看到下面的情況:

如圖所示,程式有兩處記憶體洩露地方,分配編號為 476 和 475,此時,給_crtsetbreakalloc()函式傳入476引數,再次執行程式,在退出時,會彈出如下視窗:

點選 中斷 

跳到,_crtsetbreakalloc()中斷的地方,然後在程式中,通過檢視呼叫堆疊,就可以看到應用程式的哪一次new操作沒有執行delete操作。

在中斷的同時,也可以從控制台中,看到整個程式析構的順序,如下圖所示:

1. 當程式確認沒有記憶體洩露時,不可以呼叫_crtsetbreakalloc(475),因為,這樣會在指定記憶體分配次數發生時,強制中斷程式。

2. 這種檢測記憶體分配的方式,要求,程式在執行過程中,是可還原的(多次執行過程的記憶體分配順序不會傳送變化),這個假設,在多數情況下是成立的,不過,在多執行緒執行的環境下,有時候難以保證。

3. 對於普通c程式,上述檢測方法也是成立的,只不過new換成了malloc,delete換成了free

4. 比如 int *p = new int[4]; delete p; 這種方式的洩露,上述方法是檢測不出來,此時,需要cppcheck等更有力的工具來檢查。

Linux使用者程序記憶體洩露一種檢測方法

在 linux 中,使用者程序在 proc status 檔案中記錄了該程序的記憶體使用實時情況。vmsize 虛擬記憶體大小。整個程序使用虛擬記憶體大小,是 vmlib,vmexe,vmdata,和 vmstk 的總和。vmlck 虛擬記憶體鎖。程序當前使用的並且加鎖的虛擬記憶體總數 vmrss ...

記憶體洩露越界的一種檢測方式,只能檢測部分

記憶體越界在 編寫中很常見,下面介紹如果防止部分記憶體越界。一般而言,系統中存在下面幾個函式 malloc,free,memcpy,memcmp 首先要做的是將上述函式進行封裝,前面加上字首csdn malloc,csdn free,csdn memcpy,csdn memcmp,malloc的時候...

一種定位記憶體洩露的方法(Linux)

本文是 一種定位記憶體洩露的方法 solaris 對應的 linux 版本,偵錯程式使用 gdb。主要介紹例項部分。其他請見 一種定位記憶體洩露的方法 solaris 模擬 new失敗的程式 include class abc int i int j void f throw std bad all...