如何檢查C 中的記憶體洩露

2021-06-27 08:53:51 字數 2216 閱讀 9648

如何檢查c++中的記憶體洩漏

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

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

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

int*p=

newint;p

=new

int;   

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

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

1.包含標頭檔案和定義

_crtdbg_map_alloc   

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

<

stdlib.h

>

<

crtdbg.h

>

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

(2)如果有cpp檔案無法看到這三行,以下函式就無效了,於是應該把這三行放到乙個標頭檔案裡,確保每個cpp檔案會呼叫到它

2.方法一:使用_crtdumpmemoryleaks()

intmain(

intargc , 

char

*argv)

_crtdumpmemoryleaks();

return0;

} 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函式裡呼叫的,於是判斷記憶體洩漏

classa~

a()};

intmain(

intargc , 

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;

intmain(

intargc , 

char

*argv)

output:

dumping objects ->

normal block at 0x00384da8, 4 bytes long.

data: cd cd cd cd 

object dump complete.

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

inttmpflag 

=_crtsetdbgflag( _crtdbg_report_flag );

tmpflag 

|=_crtdbg_leak_check_df;

_crtsetdbgflag( tmpflag );

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

intmain(

intargc , 

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.

4.方法四:使用_crtsetbreakalloc(563); // 最好在你記憶體分配的前面加上記憶體溢位的行號;

如何檢查記憶體洩露

前一段時間寫了一些 自以為速度和效率都還不錯,測試執行了一段時間,發現 程式總會在中途死掉,仔細查查,原來是記憶體洩露的原故。看來寫程式還真是個細活,以後在這方面要加強。下面是我從網上搜到的檢查記憶體洩露的文章,還比較有用,牛人真是無處不在啊,以後有問題要多動手從網上找原因。如何檢查記憶體洩露問題 ...

c 記憶體洩露的檢查

對於c 的記憶體洩露檢測,除了我們自己手動檢查以外,還可以使用c 中的函式來幫助我們檢測,如下 include stdafx.h include include include using namespace std intmain 除錯的時候按f5,而不是ctrl f5否則你看不到任何除錯資訊。如...

檢查C 記憶體洩露的方法

怎樣檢查你的 有沒有記憶體洩露呢?需要在前面加上這些 ifdef debug define debug clientblock new client block,file line else define debug clientblock endif define crtdbg map alloc...