共用方式為


CMemoryState 結構

提供在程式中偵測記憶體流失的便利方式。

語法

struct CMemoryState

成員

公用建構函式

名稱 描述
CMemoryState::CMemoryState 建構類似類別的結構,以控制記憶體檢查點。

公用方法

名稱 描述
CMemoryState::Checkpoint 取得目前記憶體狀態的快照集(檢查點)。
CMemoryState::D ifference 計算 類型 CMemoryState 兩個 物件之間的差異。
CMemoryState::D umpAllObjectsSince 傾印自上一個檢查點以來所有目前配置之物件的摘要。
CMemoryState::D umpStatistics 列印物件的記憶體配置統計資料 CMemoryState

備註

CMemoryState 是 結構,沒有基類。

當物件的記憶體配置在堆積上,但不再需要時不會解除配置時,就會發生「記憶體流失」。 這類記憶體流失最終可能會導致記憶體不足錯誤。 有數種方式可在程式中配置和解除配置記憶體:

  • malloc/ free 使用執行時間程式庫中的函式系列。

  • 使用 Windows API 記憶體管理功能和 LocalAlloc/ / GlobalAllocLocalFreeGlobalFree

  • 使用 C++ newdelete 運算子。

診斷 CMemoryState 只會協助偵測使用 new 運算子配置的記憶體未解除配置 delete 時所造成的記憶體流失。 其他兩組記憶體管理函式適用于非 C++ 程式,不建議在相同程式中將它們與 newdelete 混合在一起。 當您需要檔案和記憶體配置行號追蹤時,會提供額外的宏DEBUG_NEW來取代 new 運算子。 每當您通常會使用 運算子時,就會使用 new DEBUG_NEW。

如同其他診斷, CMemoryState 診斷僅適用于程式的偵錯版本。 偵錯版本必須定義_DEBUG常數。

如果您懷疑程式記憶體流失,您可以使用 CheckpointDifferenceDumpStatistics 函式來探索程式執行中兩個不同點的記憶體狀態(已配置的物件)之間的差異。 這項資訊有助於判斷函式是否正在清除它配置的所有物件。

如果只要知道配置和解除配置的不平衡位置並未提供足夠的資訊,您可以使用 函 DumpAllObjectsSince 式來傾印自先前呼叫 Checkpoint 以來配置的所有物件。 此傾印會顯示配置順序、已設定物件的來源檔案和行(如果您使用DEBUG_NEW配置),以及物件的衍生、其位址和大小。 DumpAllObjectsSince 也會呼叫每個物件的 函 Dump 式,以提供其目前狀態的相關資訊。

如需如何使用 CMemoryState 和其他診斷的詳細資訊,請參閱 偵錯 MFC 應用程式

注意

CMemoryState 別物件和成員函式呼叫的宣告應該以 #if defined(_DEBUG)/#endif 指示詞括住。 這只會將記憶體診斷包含在程式偵錯組建中。

繼承階層架構

CMemoryState

需求

標頭: afx.h

CMemoryState::Checkpoint

擷取記憶體的快照集摘要,並將其儲存在此物件中 CMemoryState

void Checkpoint();

備註

成員 CMemoryState 函式 Difference DumpAllObjectsSince 會使用此快照集資料。

範例

請參閱 CMemoryState 建構函式的 範例。

CMemoryState::CMemoryState

建構必須由 Checkpoint Difference 成員函式填入的 空白 CMemoryState 物件。

CMemoryState();

範例

CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();

CMemoryState::D ifference

比較兩個 CMemoryState 物件,然後將差異儲存在此 CMemoryState 物件中。

BOOL Difference(
    const CMemoryState& oldState,
    const CMemoryState& newState);

參數

oldState
檢查點所 CMemoryState 定義的初始記憶體狀態。

newState
檢查點所 CMemoryState 定義的新記憶體狀態。

傳回值

如果兩個記憶體狀態不同,則為非零;否則為 0。

備註

必須針對兩個記憶體狀態參數的每個呼叫檢查點

範例

請參閱 CMemoryState 建構函式的 範例。

CMemoryState::D umpAllObjectsSince

針對衍生自 CObject 已配置類別之類型的所有物件呼叫 函 Dump 式,該物件自上次 呼叫此 CMemoryState 物件的檢查點 呼叫後,仍會配置 。

void DumpAllObjectsSince() const;

備註

使用未初始化 CMemoryState 的物件呼叫 DumpAllObjectsSince 將會傾印出目前記憶體中的所有物件。

範例

請參閱 CMemoryState 建構函式的 範例。

CMemoryState::D umpStatistics

CMemoryState Difference 成員函式所填入的物件列印精簡的 記憶體統計資料包表。

void DumpStatistics() const;

備註

報表會列印在 afxDump 裝置上,如下所示:

範例報告提供下列數位的相關資訊:。

  • 可用區塊

  • 標準區塊

  • CRT 區塊

  • ignore 區塊

  • 用戶端區塊

  • 程式一次使用的記憶體上限 (以位元組為單位)

  • 程式目前使用的記憶體總計(以位元組為單位)

免費區塊是已設定 delayFreeMemDF 為 時 afxMemDF ,解除配置延遲的區塊數目。 如需詳細資訊,請參閱 一節中的 afxMemDF

範例

下列程式碼應該放在 projname App.cpp 中。 定義下列全域變數:

static CMemoryState oldstate, newstate, diffstate;

在 函式中 InitInstance ,新增這一行:

oldstate.Checkpoint();

新增 函式的 ExitInstance 處理常式,並使用下列程式碼:

newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
   TRACE(_T("Memory leaked\n"));
   diffstate.DumpStatistics();
}

您現在可以在偵錯模式中執行程式,以查看函式 DumpStatistics 的輸出。

另請參閱

階層架構圖表