デバッグ ビルドを使用したメモリ上書きのチェック
デバッグ ビルドを使用してメモリの上書きをチェックするには、まず、デバッグ用にプロジェクトを再ビルドする必要があります。次に、アプリケーションの InitInstance 関数の先頭に移動し、次の行を追加します。
afxMemDF |= checkAlwaysMemDF;
デバッグ メモリ アロケーターでは、すべてのメモリ割り当てをガード バイトで囲みます。ただし、これらのガード バイトは、それらが変更された (つまり、メモリ上書きされた) かどうかをチェックしなければ意味がありません。チェックが行われないのでは、実質的に、メモリ上書きを回避できるバッファーになるだけです。
checkAlwaysMemDF を有効にすると、new または delete を呼び出すたびに、MFC が AfxCheckMemory 関数を呼び出します。メモリ上書きが検出された場合、次のような TRACE メッセージが生成されます。
Damage Occurred! Block=0x5533
このようなメッセージが表示された場合は、コードを調べて、どこが壊れているのかを確認します。より正確にメモリ上書きの発生箇所を特定するには、AfxCheckMemory を明示的に呼び出します。次に例を示します。
ASSERT(AfxCheckMemory());
DoABunchOfStuff();
ASSERT(AfxCheckMemory());
最初の ASSERT が成功し、2 番目の ASSERT が失敗した場合、メモリ上書きはこの 2 つの関数呼び出しの間で発生したことになります。
アプリケーションによっては、afxMemDF が原因で、テストするだけでもプログラムの実行速度がかなり低下することがあります。変数 afxMemDF により、new と delete が呼び出されるたびに AfxCheckMemory が呼び出されます。この場合、上記の例のように AfxCheckMemory( ) の呼び出しを分散させ、メモリ上書きを特定するようにします。