次の方法で共有


オブジェクト ダンプ

更新 : 2007 年 11 月

このトピックの内容は、次の製品に該当します。

Edition

Visual Basic

C#

C++

Web Developer

Express

トピック該当なし トピック該当なし

ネイティブのみ

トピック該当なし

Standard

トピック該当なし トピック該当なし

ネイティブのみ

トピック該当なし

Pro/Team

トピック該当なし トピック該当なし

ネイティブのみ

トピック該当なし

表の凡例 :

トピック該当

対象

トピック該当なし

該当なし

トピックは該当しますが、コマンドは既定では非表示です

既定で非表示のコマンド

MFC プログラムでは、CMemoryState::DumpAllObjectsSince を使用して、ヒープから解放されずに残っているすべてのオブジェクトの詳細情報をダンプできます。DumpAllObjectsSince は、前回の CMemoryState::Checkpoint 以降に割り当てられたオブジェクトをすべてダンプします。Checkpoint が一度も呼び出されていない場合は、メモリ上に存在するオブジェクトと非オブジェクトをすべてダンプします。

8sdw7154.alert_note(ja-jp,VS.90).gifメモ :

MFC のオブジェクト ダンプ機能を使用する場合は、まず「方法 : メモリ診断を有効にする」の手順を実行する必要があります。

8sdw7154.alert_note(ja-jp,VS.90).gifメモ :

MFC では、メモリ リークが発生したオブジェクトはすべてプログラムの終了時に自動的にダンプされるため、オブジェクトをダンプするためにコードを作成する必要はありません。

次のコードは、2 つのメモリ状態を比較することによってメモリ リークを調べ、リークが検出された場合はすべてのオブジェクトをダンプします。

レガシ コードの例

if( diffMemState.Difference( oldMemState, newMemState ) )
{
   TRACE( "Memory leaked!\n" );
   diffMemState.DumpAllObjectsSince();
}

次のような情報がダンプされます。

Dumping objects ->

{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4

Last Name: Smith
First Name: Alan
Phone #: 581-0215

{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long

信頼性の高いプログラミング

行の先頭に記述されている中かっこ内の数字は、そのオブジェクトが割り当てられた順番を示します。後に割り当てられたオブジェクトほど数字は大きくなり、ダンプ情報の上部に表示されます。この例のさらに詳しい分析については、「オブジェクト ダンプの解釈」を参照してください。

オブジェクト ダンプによって最大限の情報を得るには、CObject 派生オブジェクトの Dump メンバ関数をオーバーライドして、オブジェクト ダンプのカスタマイズを実行します。

特定のメモリ割り当てにブレークポイントを設定するには、グローバル変数 _afxBreakAlloc に中かっこ内の数字を設定します。再びプログラムを実行すると、そのメモリ割り当てが行われる時点で停止します。この時点で呼び出し履歴を調べると、問題の割り当てが行われた経緯がわかります。

C ランタイム ライブラリにも同様の関数 _CrtSetBreakAlloc があり、C ランタイムでのメモリ割り当てに対して使用できます。

参照

その他の技術情報

MFC におけるメモリ リークの検出