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++ 以外のプログラム用であり、 new
と同じプログラム内の delete
と組み合わせて使用することはお勧めしません。 メモリ割り当てのファイルと行番号の追跡が必要な場合に、 new
演算子を置き換える追加のマクロ (DEBUG_NEW) が用意されています。 DEBUG_NEWは、通常は new
演算子を使用する場合に常に使用されます。
他の診断と同様に、 CMemoryState
診断は、プログラムのデバッグ バージョンでのみ使用できます。 デバッグ バージョンには、_DEBUG定数が定義されている必要があります。
プログラムにメモリ リークがあると思われる場合は、 Checkpoint
、 Difference
、および 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 ブロックは、 afxMemDF
が delayFreeMemDF
に設定されている場合に割り当て解除が遅延したブロックの数です。 詳細については、「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
関数の出力を確認できるようになりました。