@Carlos のソリューションは、小さな問題に最適です。しかし、大きな問題の場合、結果として生じる速度低下は、時には我慢できないものです。
この場合、配置できます
ASSERT(_CrtCheckMemory());
コードのどこかで、問題がすでに存在していると疑われます。このコマンドは、 new
ごとにではなく、挿入された場所 (およびその場所のみ) でヒープをチェックします または delete
_CRTDBG_CHECK_ALWAYS_DF
の場合のように呼び出します .これにより、オプション _CRTDBG_CHECK_ALWAYS_DF
と比較して、妥当な実行時間が維持されます。 .
アサートを配置するためにバイナリ検索のようなアプローチを使用することで、問題のあるコード行をかなり迅速に見つけることができます。
ただし、時々 _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF)
および/または _CrtCheckMemory()
問題を検出できません。次に gflags
を使用 ヒープ破損が発生した場所を示すことができる別の可能性があります。一言で言えば:
- ページ ヒープを有効にします (通常は、管理者の権限が必要です) )、例:
ヒープが"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /enable <full_path_to_exe_to_debug.exe> /full
exe_to_debug.exe
をチェックするというレポートがあります - デバッガでプログラムを実行します。範囲外のアクセスは、ヒープを破損してアクセス違反につながり、デバッガーで簡単に確認できます。
- デバッグが完了したら、ページ ヒープを無効にします。例:
"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p /disable <full_path_to_exe_to_debug.exe>
- ヒープ チェックが有効になっているプログラムは、
で一覧表示できます。"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags.exe" /p
デバッグ ヒープを使用し、main() の最初でこれを呼び出します。
_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF);
プログラムの速度が大幅に低下しますが、破損が発生するとすぐに壊れるはずです。
詳細については、次の記事を参照してください:https://msdn.microsoft.com/en-us/library/974tc9t1.aspx#BKMK_Check_for_heap_integrity_and_memory_leaks