物件傾印
這個主題適用於:
版本 |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
僅適用原生 |
||||
Pro、Premium 和 Ultimate |
僅適用原生 |
在 MFC 程式中,您可以使用 CMemoryState::DumpAllObjectsSince 來傾印堆積上尚未解除配置之所有物件的描述。 DumpAllObjectsSince 會傾印從上一個 CMemoryState::Checkpoint 之後配置的所有物件。 如果沒有發生 Checkpoint 呼叫,DumpAllObjectsSince 會傾印目前在記憶體的所有物件和非物件。
注意事項 |
---|
您必須先啟用 HOW TO:啟用記憶體診斷,才能使用 MFC 物件傾印。 |
注意事項 |
---|
MFC 會在程式結束時自動傾印所有的遺漏物件,因此您不需要建立程式碼來傾印這個時候的物件。 |
下列程式碼會比較兩個記憶體狀態來測試記憶體遺漏,如果偵測到遺漏便會傾印所有物件:
遺留碼範例
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked!\n" );
diffMemState.DumpAllObjectsSince();
}
傾印的內容看起來像這樣:
Dumping objects ->
{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4
Last Name: Smith
First Name: Alan
Phone #: 581-0215
{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long
健全的程式設計
大多數程式碼一開頭括號裡的數字便指定了物件配置的順序。 最近配置的物件的數字最高,且會出現在傾印的最上方。 如需這個範例分析的詳細資訊,請參閱物件傾印解譯。
若要從物件傾印取得最大量的資訊,您可以覆寫任何 CObject 衍生物件的 Dump 成員函式來進行物件傾印自訂。
您可以將全域變數 _afxBreakAlloc 設定為顯示在括號裡的數字,將中斷點設於特定記憶體配置上。 如果您重新執行該程式,則當此配置發生時,偵錯工具會中斷執行。 然後您可以查看呼叫堆疊來檢視程式如何到達此點。
C 執行階段程式庫中類似此功能的函式是 _CrtSetBreakAlloc,可用於 C 執行階段配置。