方法 : メモリ割り当て番号にブレークポイントを設定する
更新 : 2007 年 11 月
このトピックの内容は、次の製品に該当します。
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
ネイティブのみ |
|||
Standard |
ネイティブのみ |
|||
Pro/Team |
ネイティブのみ |
表の凡例 :
対象 |
|
該当なし |
|
既定で非表示のコマンド |
メモ : |
---|
使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。 |
メモリ リーク レポートに表示されるファイル名と行番号は、リークしたメモリが割り当てられた位置を示します。しかし、メモリが割り当てられた位置を把握するだけでは、問題を十分に識別できない場合があります。プログラムの実行中に、同じ割り当てが何度も呼び出されているにもかかわらず、特定の呼び出しでだけメモリ リークが発生することも少なくありません。このような問題を識別するには、リークしたメモリが割り当てられた位置だけでなく、リークが発生する状況も把握する必要があります。そのために必要となる情報が、メモリの割り当て番号です。この番号は、レポート内のファイル名と行番号に続く中かっこ内に表示されています。たとえば、次の出力では 18 がメモリ割り当て番号です。これは、リークしたメモリが、プログラム内で割り当てられたメモリ ブロックのうち 18 番目のメモリ ブロックであることを示します。
Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
CRT ライブラリは、CRT ライブラリ自身や MFC などのライブラリが割り当てるメモリも含め、プログラムの実行中に割り当てられるすべてのメモリ ブロックをカウントします。したがって、割り当て番号 N のオブジェクトは、プログラム内で N 番目にメモリが割り当てられたオブジェクトです。しかし、コード内で N 番目にメモリが割り当てられたオブジェクトであるとは限りません。むしろ、そうでない場合がほとんどです。
この割り当て番号を使用して、メモリが割り当てられた位置にブレークポイントを設定できます。このためには、プログラムの先頭付近に位置ブレークポイントを設定します。プログラムがこのポイントで停止する場合は、[クイック ウォッチ] ダイアログ ボックスまたは [ウォッチ] ウィンドウから、メモリ割り当てにブレークポイントを設定できます。
手順
[ウォッチ] ウィンドウでメモリ割り当てにブレークポイントを設定するには
[ウォッチ] ウィンドウの [名前] 列に、次の式を入力します。
_crtBreakAlloc
CRT ライブラリのマルチスレッド DLL バージョン (/MD オプション) を使用している場合は、次のようにコンテキスト演算子を追加します。
{,,msvcr71d.dll}_crtBreakAlloc
Enter キーを押します。
デバッガによって呼び出しが評価され、その結果が [値] 列に表示されます。メモリ割り当てにまだブレークポイントが設定されていない場合、この値は -1 になります。
[値] 列の値をブレークポイントを設定するメモリ割り当ての番号に置き換えます。たとえば、上記の出力例のメモリ割り当てでプログラムを停止させるには、18 で置換します。
目的のメモリ割り当てにブレークポイントを設定したら、デバッグを続行します。メモリ割り当ての順序が変わらないように、前回実行したときと同じ条件でプログラムを実行してください。指定したメモリ割り当てでプログラムが停止した場合、[呼び出し履歴] ウィンドウやその他のデバッガ情報を参照して、メモリが割り当てられた状況を確認できます。必要に応じて、この後も引き続きプログラムを実行してオブジェクトに何が起きるかを確認すると、オブジェクトに割り当てられたメモリが正しく解放されない原因を確認できる場合があります。
メモ : |
---|
オブジェクトにデータ ブレークポイントを設定すると役立つことがあります。詳細については、「方法 : データ ブレークポイントを設定する (ネイティブのみ)」を参照してください。 |
メモリ割り当てにブレークポイントを設定する場合、通常はデバッガで行う方が簡単ですが、コード内で設定することもできます。
コード内でメモリ割り当てにブレークポイントを設定するには
次のような行を追加します (18 番目のメモリ割り当てに設定する場合)。
_crtBreakAlloc = 18;
代わりに、同じ機能を果たす _CrtSetBreakAlloc 関数を次のように使用することもできます。
_CrtSetBreakAlloc(18);