CMemoryState 構造体

プログラム内のメモリ リークを検出する便利な方法を提供します。

構文

struct CMemoryState

メンバー

パブリック コンストラクター

名前 説明
CMemoryState::CMemoryState メモリ チェックポイントを制御するクラスのような構造体を構築します。

パブリック メソッド

名前 説明
CMemoryState::Checkpoint 現在のメモリ状態のスナップショット (チェック ポイント) を取得します。
CMemoryState::D ifference 型の 2 つのオブジェクト間の差を計算します CMemoryState
CMemoryState::D umpAllObjectsSince 前のチェックポイント以降に現在割り当てられているすべてのオブジェクトの概要をダンプします。
CMemoryState::D umpStatistics オブジェクトのメモリ割り当ての統計情報を CMemoryState 出力します。

解説

CMemoryState は構造体であり、基底クラスを持っていません。

"メモリ リーク" は、オブジェクトのメモリがヒープに割り当てられているが、不要になったときに割り当てが解除されない場合に発生します。 このようなメモリ リークは、最終的にメモリ不足エラーにつながる可能性があります。 プログラムでメモリを割り当てて割り当てを解除するには、いくつかの方法があります。

  • ランタイム ライブラリの malloc/ free 関数ファミリの使用。

  • Windows API メモリ管理機能の使用と GlobalAlloc. LocalAllocLocalFree/ / GlobalFree

  • C++ new と演算子の delete 使用。

診断はCMemoryState、演算子を使用して割り当てられたメモリが割り当てdelete解除されていない場合に発生するメモリ リークのnew検出にのみ役立ちます。 メモリ管理機能の他の 2 つのグループは C++ 以外のプログラム用であり、それらを同じプログラムとnewdelete混在させるのはお勧めしません。 メモリ割り当てのファイルと行番号の追跡が必要な場合に、演算子を new 置き換える追加のマクロDEBUG_NEWが用意されています。 DEBUG_NEWは、通常は演算子を使用する場合に常に new 使用されます。

他の診断と同様にCMemoryState、診断はプログラムのデバッグ バージョンでのみ使用できます。 デバッグ バージョンには、_DEBUG定数が定義されている必要があります。

プログラムにメモリ リークがあると思われる場合は、プログラムの実行の 2 つの異なるポイントで 、DifferenceおよびDumpStatistics関数を使用Checkpointしてメモリ状態 (割り当てられたオブジェクト) の違いを検出できます。 この情報は、関数が割り当てるすべてのオブジェクトをクリーンしているかどうかを判断するのに役立ちます。

割り当てと割り当て解除の不均衡が発生する場所を知るだけで十分な情報が得られない場合は、関数を DumpAllObjectsSince 使用して、前回の呼び出し以降に割り当てられたすべてのオブジェクトを Checkpointダンプできます。 このダンプには、割り当ての順序、オブジェクトが割り当てられたソース ファイルと行 (割り当てにDEBUG_NEWを使用している場合)、およびオブジェクトの派生、そのアドレス、およびサイズが表示されます。 DumpAllObjectsSince また、各オブジェクトの関数を呼び出して、現在の Dump 状態に関する情報を提供します。

使用方法CMemoryStateとその他の診断の詳細については、「MFC アプリケーションのデバッグ」を参照してください

Note

CMemoryState のオブジェクトの宣言とメンバー関数の呼び出しは、ディレクティブで角かっこで #if defined(_DEBUG)/#endif 囲む必要があります。 これにより、メモリ診断がプログラムのデバッグ ビルドにのみ含まれます。

継承階層

CMemoryState

必要条件

ヘッダー: afx.h

CMemoryState::Checkpoint

メモリのスナップショット概要を取得し、このCMemoryStateオブジェクトに格納します。

void Checkpoint();

解説

CMemoryStateメンバー関数 DifferenceDumpAllObjectsSince は、このスナップショット データを使用します。

CMemoryState コンストラクターの例を参照してください。

CMemoryState::CMemoryState

Checkpoint または Difference メンバー関数で入力する必要がある空CMemoryStateのオブジェクトを構築します。

CMemoryState();

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

CMemoryState::D ifference

2 つの CMemoryState オブジェクトを比較し、その差をこの CMemoryState オブジェクトに格納します。

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

パラメーター

oldState
チェックポイントによって定義されたCMemoryState初期メモリ状態。

newState
チェックポイントによって定義されたCMemoryState新しいメモリ状態。

戻り値

2 つのメモリ状態が異なる場合は 0 以外。それ以外の場合は 0。

解説

チェックポイント は、2 つのメモリ状態パラメーターのそれぞれに対して呼び出されている必要があります。

CMemoryState コンストラクターの例を参照してください。

CMemoryState::D umpAllObjectsSince

このCMemoryStateオブジェクトのDump最後の Checkpoint 呼び出し以降に割り当てられた (まだ割り当てられている) クラスCObjectから派生した型のすべてのオブジェクトに対して関数を呼び出します。

void DumpAllObjectsSince() const;

解説

初期化CMemoryStateされていないオブジェクトを呼び出すとDumpAllObjectsSince、現在メモリ内のすべてのオブジェクトがダンプされます。

CMemoryState コンストラクターの例を参照してください。

CMemoryState::D umpStatistics

Difference メンバー関数によって入力されたオブジェクトからCMemoryState簡潔なメモリ統計レポートを出力します。

void DumpStatistics() const;

解説

afxDump デバイスに出力されるレポートには、次の内容が表示されます。

サンプル レポートには、次の数 (または金額) に関する情報が表示されます。

  • free ブロック

  • normal ブロック

  • CRT ブロック

  • ブロックを無視する

  • クライアント ブロック

  • プログラムが一度に使用する最大メモリ (バイト単位)

  • プログラムによって現在使用されているメモリの合計 (バイト単位)

Free ブロックは、割り当て解除が遅延されたafxMemDFdelayFreeMemDFブロックの数です ()。 詳細については、「 MFC マクロとグローバル」セクションの 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 確認できるようになりました。

関連項目

階層図