C 檢測記憶體洩露

2021-06-29 02:19:48 字數 1795 閱讀 1159

p=new int; //p指標修改,原來申請記憶體的位址沒有記錄下來,於是無法釋放 下面介紹如何檢查記憶體洩漏:
1.包含標頭檔案和定義#define _crtdbg_map_alloc //並非絕對需要該語句,但如果有該語句,列印出來的是檔名和行數等更加直觀的資訊#include
#include
(1)#include語句必須採用上文所示順序。如果更改了順序,所使用的函式可能無法正確工作
(2)如果有cpp檔案無法看到這三行,以下函式就無效了,於是應該把這三行放到乙個標頭檔案裡,確保每個cpp檔案會呼叫到它
2.方法一:使用_crtdumpmemoryleaks()
int main(int argc , char* argv)
_crtdumpmemoryleaks();return 0;
}
output:detected memory leaks!

dumping objects -> normal block at 0x00384da8, 4 bytes long.

data: < > cd cd cd cd

object dump complete.

其內容包括:記憶體分配型號(在大括號內)、塊型別(普通、客戶端或 crt)、 十六進製制形式的記憶體位置、以位元組為單位的塊大小、以位元組為單位的塊大小、前 16 位元組的內容(十六進製制)
注意:(1)大括號的位置,如果不加,這塊記憶體是等到main函式結束才洩漏的,而_crtdumpmemoryleaks()是在main函式裡呼叫的,於是判斷記憶體洩漏
class a
~a()};
int main(int argc , char* argv)
output:detected memory leaks!
dumping objects -> normal block at 0x00384da8, 4 bytes long.

data: < > cd cd cd cd

object dump complete.

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

int main(int argc , char* argv)

output:dumping objects -> normal block at 0x00384da8, 4 bytes long.

data: < > cd cd cd cd

object dump complete.

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.

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...

c 記憶體洩露檢測

vs平台下提供了crt庫檢測和識別記憶體洩漏的有效方法。原理大致如下 記憶體分配要通過crt在執行時實現,只要在分配記憶體和釋放記憶體時分別做好記錄,程式結束時對比分配記憶體和釋放記憶體的記錄就可以確定是不是有記憶體洩漏。1.在vs中使用時,需加上 define crtdbg map alloc i...