CMemoryState 結構
提供在程序中偵測記憶體流失的便利方式。
語法
struct CMemoryState
成員
公用建構函式
名稱 | 描述 |
---|---|
CMemoryState::CMemoryState | 建構類似類別的結構,以控制記憶體檢查點。 |
公用方法
名稱 | 描述 |
---|---|
CMemoryState::Checkpoint | 取得目前記憶體狀態的快照集(檢查點)。 |
CMemoryState::D ifference | 計算類型 CMemoryState 兩個 對象之間的差異。 |
CMemoryState::D umpAllObjectsSince | 傾印自上一個檢查點以來所有目前配置之物件的摘要。 |
CMemoryState::D umpStatistics | 列印物件的記憶體配置統計數據 CMemoryState 。 |
備註
CMemoryState
是結構,沒有基類。
當物件的記憶體配置在堆積上,但不再需要時不會解除分配時,就會發生「記憶體流失」。 這類記憶體流失最終可能會導致記憶體不足錯誤。 有數種方式可在程式中配置和解除分配記憶體:
malloc
/free
使用運行時間連結庫中的函式系列。使用 Windows API 記憶體管理功能與
LocalAlloc
LocalFree
/GlobalAlloc
/GlobalFree
。使用 C++
new
和delete
運算符。
診斷 CMemoryState
只會協助偵測使用 new
運算符配置的記憶體未解除分配 delete
時所造成的記憶體流失。 其他兩組記憶體管理函式適用於非C++程式,不建議將它們與 new
delete
和 混合在相同的程式中。 當您需要記憶體配置的檔案和行號追蹤時,會提供額外的巨集DEBUG_NEW來取代 new
運算符。 每當您通常會使用 運算符時,就會使用 new
DEBUG_NEW。
如同其他診斷, CMemoryState
診斷僅適用於程序的偵錯版本。 偵錯版本必須定義_DEBUG常數。
如果您懷疑程式記憶體流失,您可以使用 Checkpoint
、 Difference
和 DumpStatistics
函式來探索程式執行中兩個不同點的記憶體狀態(已配置的物件)之間的差異。 這項資訊有助於判斷函式是否正在清除它配置的所有物件。
如果只要知道配置和解除分配的不平衡位置並未提供足夠的資訊,您可以使用 函 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
,解除分配延遲的區塊數目。 如需詳細資訊,請參閱
範例
下列程式代碼應該放在 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
的輸出。