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/ LocalFree 、および GlobalAlloc/ GlobalFree を使用します。

  • C++ new および delete 演算子の使用。

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

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

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

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

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

注意

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

継承階層

CMemoryState

要件

ヘッダー: afx.h

CMemoryState:: Checkpoint

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

void Checkpoint();

注釈

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

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

CMemoryState:: CMemoryState

チェックポイントまたは差分メンバー関数によって入力される必要がある空 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 オブジェクトの最後のチェックポイント呼び出し以降に割り当てられた (ただし、まだ割り当てられていた) クラス CObject から派生した型のすべてのオブジェクトに対して、 Dump 関数を呼び出します。

void DumpAllObjectsSince() const;

注釈

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

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

CMemoryState::D umpStatistics

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

void DumpStatistics() const;

注釈

AfxDumpデバイスに印刷されるレポートには、次のものが表示されます。

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

  • 空きブロック

  • 通常のブロック

  • CRT ブロック

  • ブロックの無視

  • クライアント ブロック

  • プログラムによって一度に使用される最大メモリ (バイト単位)

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

Free ブロックは、がに設定されている場合 afxMemDFdelayFreeMemDF 、割り当て解除が遅延されたブロックの数です。 詳細については、「MFC マクロとグローバル」の「 afxMemDF」を参照してください。

次のコードは、 projnameapp.xaml に配置する必要があります。 次のグローバル変数を定義します。

static CMemoryState oldstate, newstate, diffstate;

InitInstance関数で、次の行を追加します。

oldstate.Checkpoint();

関数の ExitInstance ハンドラーを追加し、次のコードを使用します。

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

これで、プログラムをデバッグモードで実行し、関数の DumpStatistics 出力を確認できるようになりました。

関連項目

階層図