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
.LocalAlloc
LocalFree
/ /GlobalFree
C++
new
と演算子のdelete
使用。
診断はCMemoryState
、演算子を使用して割り当てられたメモリが割り当てdelete
解除されていない場合に発生するメモリ リークのnew
検出にのみ役立ちます。 メモリ管理機能の他の 2 つのグループは C++ 以外のプログラム用であり、それらを同じプログラムとnew
delete
混在させるのはお勧めしません。 メモリ割り当てのファイルと行番号の追跡が必要な場合に、演算子を 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
メンバー関数 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
オブジェクトのDump
最後の Checkpoint 呼び出し以降に割り当てられた (まだ割り当てられている) クラスCObject
から派生した型のすべてのオブジェクトに対して関数を呼び出します。
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
確認できるようになりました。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示