分享方式:


CMemoryState 結構

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

語法

struct CMemoryState

成員

公用建構函式

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

公用方法

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

備註

CMemoryState 是結構,沒有基類。

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

  • malloc/ free使用運行時間連結庫中的函式系列。

  • 使用 Windows API 記憶體管理功能與 LocalAllocLocalFree/ GlobalAlloc/ GlobalFree

  • 使用 C++ newdelete 運算符。

診斷 CMemoryState 只會協助偵測使用 new 運算符配置的記憶體未解除分配 delete時所造成的記憶體流失。 其他兩組記憶體管理函式適用於非C++程式,不建議將它們與 new delete 和 混合在相同的程式中。 當您需要記憶體配置的檔案和行號追蹤時,會提供額外的巨集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 函式 DifferenceDumpAllObjectsSince 會使用此快照集數據。

範例

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

CMemoryState::CMemoryState

建構必須由 CheckpointDifference 成員函式填入的空白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

範例

下列程式代碼應該放在 projnameApp.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 的輸出。

另請參閱

階層架構圖表