出處: http://www.cppblog.com/lyt/archive/2009/03/22/77517.html
記憶體洩漏是程式設計中常常見到的乙個問題,我所遇過的原因有兩個:
1.分配完記憶體後忘記**
2.**有問題,造成想**卻無法**,例如:
int *
p =new
int ;p
= new
int;
// p指標修改,原來申請記憶體的位址沒有記錄下來,於是無法釋放
下面介紹如何檢查記憶體洩漏:
1.包含標頭檔案和定義
_crtdbg_map_alloc
// 並非絕對需要該語句,但如果有該語句,列印出來的是檔名和行數等更加直觀的資訊
<
stdlib.h
>
<
crtdbg.h
>
(1)#include語句必須採用上文所示順序。如果更改了順序,所使用的函式可能無法正確工作
(2)如果有cpp檔案無法看到這三行,以下函式就無效了,於是應該把這三行放到乙個標頭檔案裡,確保每個cpp檔案會呼叫到它
2.方法一:使用_crtdumpmemoryleaks()
int main(
intargc ,
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(
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;
int main(
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中輸出記憶體洩漏資訊
int tmpflag
= _crtsetdbgflag( _crtdbg_report_flag );
tmpflag
|= _crtdbg_leak_check_df;
_crtsetdbgflag( tmpflag );
3.方法三:使用_crtmemcheckpoint(),可以查出某程式段的記憶體洩漏情況
int main(
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.
如何檢查C 中的記憶體洩漏
如何檢查c 中的記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題,我所遇過的原因有兩個 1.分配完記憶體後忘記 2.有問題,造成想 卻無法 例如 int p new int p new int p指標修改,原來申請記憶體的位址沒有記錄下來,於是無法釋放 下面介紹如何檢查記憶體洩漏 1.包含標頭檔...
如何檢查C 中的記憶體洩漏
記憶體洩漏是程式設計中常常見到的乙個問題,我所遇過的原因有兩個 1.分配完記憶體後忘記 2.有問題,造成想 卻無法 例如 int p newint p new int p指標修改,原來申請記憶體的位址沒有記錄下來,於是無法釋放 下面介紹如何檢查記憶體洩漏 1.包含標頭檔案和定義 crtdbg map...
如何檢查C 中的記憶體洩漏
記憶體洩漏是程式設計中常常見到的乙個問題,我所遇過的原因有兩個 1.分配完記憶體後忘記 2.有問題,造成想 卻無法 例如 int p newint p new int p指標修改,原來申請記憶體的位址沒有記錄下來,於是無法釋放 下面介紹如何檢查記憶體洩漏 1.包含標頭檔案和定義 crtdbg map...