次の方法で共有


CMemoryState 構造体

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

構文

struct CMemoryState

メンバー

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

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

パブリック メソッド

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

解説

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

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

  • ランタイム ライブラリから malloc/ free 関数ファミリを使用する。

  • Windows API メモリ管理機能、 LocalAlloc/ LocalFreeGlobalAlloc/ GlobalFreeを使用する。

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

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

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

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

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

CMemoryStateおよびその他の診断の使用方法の詳細については、「MFC アプリケーションのの概要」を参照

Note

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

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

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

パラメーター

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

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

戻り値

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

解説

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

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

CMemoryState::D umpAllObjectsSince

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

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 関数の出力を確認できるようになりました。

関連項目

階層図