メモリ状態の比較
更新 : 2007 年 11 月
このトピックの内容は、次の製品に該当します。
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
![]() |
![]() |
ネイティブのみ |
![]() |
Standard |
![]() |
![]() |
ネイティブのみ |
![]() |
Pro/Team |
![]() |
![]() |
ネイティブのみ |
![]() |
表の凡例 :
![]() |
対象 |
![]() |
該当なし |
![]() |
既定で非表示のコマンド |
メモリ リークの位置を特定するためのもう 1 つの方法では、ある時点におけるアプリケーションのメモリ状態のスナップショットを取得します。CRT ライブラリには、メモリ状態のスナップショットを格納するために使用できる構造体型 _CrtMemState が用意されています。
_CrtMemState s1, s2, s3;
任意の時点でのメモリ状態のスナップショットを取得するには、_CrtMemState 構造体を _CrtMemCheckpoint 関数に渡します。この関数は、現在のメモリ状態のスナップショットを構造体に格納します。
_CrtMemCheckpoint( &s1 );
_CrtMemState 構造体を _CrtMemDumpStatistics 関数に渡すことによって、任意の時点で構造体に格納されている内容をダンプできます。
_CrtMemDumpStatistics( &s1 );
この関数は、次のようなメモリ割り当て情報をダンプ出力します。
0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
3071 bytes in 16 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 3071 bytes.
Total allocations: 3764 bytes.
コード内のセクションでメモリ リークが発生したかどうかを調べるには、そのセクションの前後のメモリ状態のスナップショットを取得した後で、_CrtMemDifference を使用して 2 つのメモリ状態を比較します。
_CrtMemCheckpoint( &s1 );
// memory allocations take place here
_CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2) )
_CrtMemDumpStatistics( &s3 );
_CrtMemDifference という名前が示しているように、この関数は 2 つのメモリ状態 (s1 および s2) を比較し、両者の差を結果 (s3) として生成します。プログラムの先頭と末尾で _CrtMemCheckpoint を呼び出し、_CrtMemDifference を使用して結果を比較する方法でも、メモリ リークをチェックできます。リークが検出された場合は、_CrtMemCheckpoint 呼び出しを使用してプログラムを分割し、バイナリ検索技法によってリークの位置を特定できます。