VS檢測記憶體洩漏

2022-09-23 14:30:11 字數 4118 閱讀 2726

使用vs的記憶體檢測有以下幾種方法。

在debug模式下以f5執行:

方法一:

[html]view plaincopy

#definecrtdbg_map_alloc

#include

#include

//在入口函式中包含_crtdumpmemoryleaks();

//即可檢測到記憶體洩露

//以如下測試函式為例:

intmain()

f5執行輸出視窗會得到:

detected memory leaks!

dumping objects ->

normal block at 0x00341a38, 10 bytes long.

data: < > cd cd cd cd cd cd cd cd cd cd

object dump complete.以上方法沒有輸出

注意:1.在vs2010下測試的時候,發現_crtdumpmemoryleaks();這句必須放在函式結束處,放在主函式入口處輸出視窗不會輸出記憶體洩露資訊

2.{}中的數字指明這塊記憶體是程式中總計第幾個被申請的,這種方法沒有行號和其他資訊輸出。我們可以定義:

[html]view plaincopy

#ifdef_debug

#definenewnew(_normal_block,__file__,__line__)

#endif

#definecrtdbg_map_alloc

#include

#include

//在入口函式中包含_crtdumpmemoryleaks();

//即可檢測到記憶體洩露

//以如下測試函式為例:

intmain()

輸出:detected memory leaks!

dumping objects ->

e:\vs2005\stltest\stltest\test.cpp(14) : normal block at 0x00591a38, 10 bytes long.

data: < > cd cd cd cd cd cd cd cd cd cd

object dump complete.方法二:

[html]view plaincopy

#definecrtdbg_map_alloc

#include

#include

//在入口函式中包含_crtdumpmemoryleaks();

//即可檢測到記憶體洩露

//定義函式:

inlinevoidenablememleakcheck()

//該函式可以放在主函式的任意位置,都能正確的觸發記憶體洩露輸出

//以如下測試函式為例:

intmain()

輸出:detected memory leaks!

dumping objects ->

normal block at 0x004f1a38, 10 bytes long.

data: < > cd cd cd cd cd cd cd cd cd cd

object dump complete.方法三:直接定位指定記憶體塊錯誤的**行

單確定了記憶體洩漏發生在哪一行,有時候並不足夠。特別是同乙個new對應有多處釋放的情形。在實際的工程中,以下兩種情況很典型:

建立物件的地方是乙個類工廠(classfactory)模式。很多甚至全部類例項由同乙個new建立。對於此,定位到了new出物件的所在行基本沒有多大幫助。

com物件。我們知道com物件採用reference count維護生命週期。也就是說,物件new的地方只有乙個,但是release的地方很多,你要乙個個排除。

那麼,有什麼好辦法,可以迅速定位記憶體洩漏?

答:有。

在記憶體洩漏情況複雜的時候,你可以用以下方法定位記憶體洩漏。這是我個人認為通用的記憶體洩漏追蹤方法中最有效的手段。

我們再回頭看看crtdbg生成的記憶體洩漏報告:

detected memory leaks!

dumping objects ->

normal block at 0x004f1a38, 10 bytes long.

data: < > cd cd cd cd cd cd cd cd cd cd

object dump complete.除了產生該記憶體****存分配語句所在的檔名、行號為,我們注意到有乙個比較陌生的資訊:。這個整數值代表了什麼意思呢?

其實,它代表了第幾次記憶體分配操作。象這個例子,代表了第58次記憶體分配操作發生了洩漏。你可能要說,我只new過一次,怎麼會是第58次?這很容易理解,其他的記憶體申請操作在c的初始化過程呼叫的唄。:)

有沒有可能,我們讓程式執行到第58次記憶體分配操作的時候,自動停下來,進入除錯狀態?所幸,crtdbg確實提供了這樣的函式:即long _crtsetbreakalloc(long nallocid)。我們加上它:

[html]view plaincopy

#definecrtdbg_map_alloc

#include

#include

intmain()

你發現,程式執行到char* pchars = new char[10];一句時,自動停下來進入除錯狀態。細細體會一下,你可以發現,這種方式你獲得的資訊遠比在程式退出時獲得檔名及行號有價值得多。因為報告洩漏檔名及行號,你獲得的只是靜態的資訊,然而_crtsetbreakalloc則是把整個現場恢復,你可以通過對函式呼叫棧分析(我發現很多人不習慣看函式呼叫棧,如果你屬於這種情況,我強烈推薦你去補上這一課,因為它太重要了)以及其他**除錯技巧,來分析產生記憶體洩漏的原因。通常情況下,這種分析方法可以在5分鐘內找到肇事者。

ps:在vs2010下使用這兩種方法,巨集和標頭檔案不用包含也可以正確執行:

#definecrtdbg_map_alloc

#include

#include非mfc程式可以用以下方法檢測記憶體洩露:

1.程式開始包含如下定義:

#ifdef _debug

#define debug_clientblock new( _client_block, __file__, __line__)

#else

#define debug_clientblock

#endif// _debug

#define _crtdbg_map_alloc

#include

#include

#ifdef _debug

#define new debug_clientblock

#endif// _debug2.程式中新增下面的函式:

_crtsetdbgflag(_crtdbg_alloc_mem_df|_crtdbg_leak_check_df);

debug版本程式執行結束後如有記憶體洩漏,輸出視窗中會顯示類似資訊:

detected memory leaks!

dumping objects ->

g:\programs\test\test.cpp(16) : client block at 0x00385c58, subtype 0, 4 bytes long.

data: <> cd cd cd cd

object dump complete.mfc程式記憶體洩漏檢測方法:

1.在 cmyapp 中新增如下三個 cmemorystate 類的成員變數:

#ifdef _debug

protected:

cmemorystate m_msold, m_msnew, m_msdiff;

#endif// _debug2.在 cmyapp::initinstance() 中新增如下**:

#ifdef _debug

m_msold.checkpoint();

#endif// _debug3.在 cmyapp::exitinstance() 中新增如下**:

#ifdef _debug

m_msnew.checkpoint();

if (m_msdiff.difference(m_msold, m_msnew))

normal block at 0x00d98150, 8 bytes long.

data: <> a8 7f d9 00 01 00 00 00

object dump complete.

VS2005記憶體洩漏檢測方法

非mfc程式可以用以下方法檢測記憶體洩露 1.程式開始包含如下定義 ifdef debug define debug clientblock new client block,file line else define debug clientblock endif debug define crt...

記憶體洩漏檢測

一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般 最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的 reboot才會...

記憶體洩漏檢測

一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的reboot才會正常...