オブジェクト ダンプ
更新 : 2007 年 11 月
このトピックの内容は、次の製品に該当します。
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
ネイティブのみ |
|||
Standard |
ネイティブのみ |
|||
Pro/Team |
ネイティブのみ |
表の凡例 :
対象 |
|
該当なし |
|
既定で非表示のコマンド |
MFC プログラムでは、CMemoryState::DumpAllObjectsSince を使用して、ヒープから解放されずに残っているすべてのオブジェクトの詳細情報をダンプできます。DumpAllObjectsSince は、前回の CMemoryState::Checkpoint 以降に割り当てられたオブジェクトをすべてダンプします。Checkpoint が一度も呼び出されていない場合は、メモリ上に存在するオブジェクトと非オブジェクトをすべてダンプします。
メモ : |
---|
MFC のオブジェクト ダンプ機能を使用する場合は、まず「方法 : メモリ診断を有効にする」の手順を実行する必要があります。 |
メモ : |
---|
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 ランタイムでのメモリ割り当てに対して使用できます。