方法 : メモリのスナップショットを取得する
更新 : 2007 年 11 月
このトピックの内容は、次の製品に該当します。
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
ネイティブのみ |
|||
Standard |
ネイティブのみ |
|||
Pro/Team |
ネイティブのみ |
表の凡例 :
対象 |
|
該当なし |
|
既定で非表示のコマンド |
メモ : |
---|
使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。 |
ここでは、メモリ リークの位置を特定するためにメモリのスナップショットを取得する方法について説明します。
メモリ リークを検出するには
CMemoryState のメンバ オブジェクトを作成し、CMemoryState::Checkpoint メンバ関数を呼び出します。これにより、メモリの最初のスナップショットが作成されます。
プログラムでメモリの割り当てと解放が行われた後、別の CMemoryState オブジェクトを作成し、このオブジェクトの Checkpoint を呼び出します。これにより、メモリ状態の 2 番目のスナップショットが取得されます。
3 番目の CMemoryState オブジェクトを作成し、そのメンバ関数 CMemoryState::Difference を呼び出します。このとき、前に作成した 2 つの CMemoryState オブジェクトを引数として渡します。2 つのメモリ状態に違いがある場合、Difference 関数は 0 以外の値を返します。この値は、解放されていないメモリ ブロックがあることを示します。
コードの例を次に示します。
// Declare the variables needed #ifdef _DEBUG CMemoryState oldMemState, newMemState, diffMemState; oldMemState.Checkpoint(); #endif // Do your memory allocations and deallocations. CString s("This is a frame variable"); // The next object is a heap object. CPerson* p = new CPerson( "Smith", "Alan", "581-0215" ); #ifdef _DEBUG newMemState.Checkpoint(); if( diffMemState.Difference( oldMemState, newMemState ) ) { TRACE( "Memory leaked!\n" ); } #endif
メモリ チェック用のステートメントが #ifdef _DEBUG と #endif で囲まれていることに注意してください。これによって、このコードはプログラムの Win32 デバッグ バージョンでだけコンパイルされます。
メモリ リークが発生していることを確認できたので、メモリ統計情報の表示のために別のメンバ関数 CMemoryState::DumpStatistics を呼び出して、メモリ リークの位置を特定できます。