記憶體洩露檢測

2021-05-04 05:28:56 字數 2828 閱讀 5974

c++中檢測記憶體洩漏可以引入系統定義的巨集來檢視,內存在哪個位置洩漏

檔案開始處加入下列定義

#define _crtdbg_map_alloc

#include

#include

程式退出時加入以下函式:

_crtdumpmemoryleaks();

如果有洩漏會顯示

記憶體洩漏是程式設計中常常見到的乙個問題,我所遇過的原因有兩個:

1.分配完記憶體後忘記**

2.**有問題,造成想**卻無法**,例如:

int *  p = new   int ;

p = new   int ;    // p指標修改,原來申請記憶體的位址沒有記錄下來,於是無法釋放

下面介紹如何檢查記憶體洩漏:

1.包含標頭檔案和定義

#define  _crtdbg_map_alloc    // 並非絕對需要該語句,但如果有該語句,列印出來的是檔名和行數等更加直觀的資訊

#include  < stdlib.h >

#include  < crtdbg.h >

(1)#include語句必須採用上文所示順序。如果更改了順序,所使用的函式可能無法正確工作

(2)此方法只在除錯版本(debug)中有效

2.方法一:使用_crtdumpmemoryleaks()

#include  < stdlib.h >

#include  < crtdbg.h >

int  main( int  argc ,  char *  argv)

_crtdumpmemoryleaks();

return   0 ;

} output:

etected memory leaks!

dumping objects ->

normal block at 0x00384da8, 4 bytes long.

data: <    > cd cd cd cd

其內容包括:記憶體分配型號(在大括號內)、塊型別(普通、客戶端或 crt)、 十六進製制形式的記憶體位置、以位元組為單位的塊大小、以位元組為單位的塊大小、前 16 位元組的內容(十六進製制)

注意:(1)大括號的位置,如果不加,這塊記憶體是等到main函式結束才洩漏的,而_crtdumpmemoryleaks()是在main函式裡呼叫的,於是判斷記憶體洩漏

int  main( int  argc ,  char *  argv)

output:

detected memory leaks!

dumping objects ->

normal block at 0x00384da8, 1 bytes long.

data: < > 00

(2)對於一些全域性函式,如果初始化時申請了記憶體,到程式結束時候才釋放,此函式會一直把新申請的記憶體當作洩漏來對待

lytstring test = "" ;

int  main( int  argc ,  char *  argv)

output:

detected memory leaks!

dumping objects ->

normal block at 0x00384da8, 1 bytes long.

data: < > 00

可以通過exit解決:

lytstring test = "" ;

int  main( int  argc ,  char *  argv)

2.方法二:在程式入口寫幾個語句,程式退出時,如果發現有記憶體洩漏,會自動在debug output視窗和debugview中輸出記憶體洩漏資訊

int  tmpflag  =  _crtsetdbgflag( _crtdbg_report_flag );

tmpflag  |=  _crtdbg_leak_check_df;

_crtsetdbgflag( tmpflag );

3.方法三:使用_crtmemcheckpoint(),可以查出某程式段的記憶體洩漏情況

int  main( int  argc ,  char *  argv)

output:

bytes in 0 free blocks.

4 bytes in 1 normal blocks.

0 bytes in 0 crt blocks.

0 bytes in 0 ignore blocks.

0 bytes in 0 client blocks.

largest number used: 0 bytes.

total allocations: 4 bytes.

檢測記憶體洩露

程式結束時,作業系統會 程式占用的資源.但是,只要程式還在執行,如果不進行清理,資源最終可能被耗盡.1.vc記憶體洩露檢查工具 visual leak detector 現在已知的最新有2.0版本的,使方法不詳。使用 visual leak detector 2.2.3 在vs工程的linker i...

記憶體洩露檢測

1 包含標頭檔案 include include 2 每個cpp檔案包含 static char this file file define new new normal block,this file,line 3 設定標誌 int tmpdbgflag tmpdbgflag crtsetdbgf...

記憶體洩露檢測

記憶體洩漏是程式設計中常常見到的乙個問題,我所遇過的原因有兩個 1.分配完記憶體後忘記 2.有問題,造成想 卻無法 例如 int p newint p new int p指標修改,原來申請記憶體的位址沒有記錄下來,於是無法釋放 下面介紹如何檢查記憶體洩漏 1.包含標頭檔案和定義 crtdbg map...