Windows用のデバッグツールと組み合わせたアプリケーションベリファイアは素晴らしいセットアップです。両方をWindowsDriverKitまたは軽量のWindowsSDKの一部として入手できます。(ヒープ破損の問題に関する以前の質問を調査したときに、Application Verifierについて知りました。)過去にもBoundsCheckerとInsure ++(他の回答で言及)を使用しましたが、ApplicationVerifierの機能の量には驚いていました。
電気柵(別名「efence」)、dmalloc、valgrindなどはすべて言及する価値がありますが、これらのほとんどはWindowsよりも*nixで実行する方がはるかに簡単です。Valgrindは途方もなく柔軟性があります。私はそれを使用して多くのヒープの問題がある大規模なサーバーソフトウェアをデバッグしました。
他のすべてが失敗した場合、独自のグローバル演算子new/deleteおよびmalloc/calloc / reallocオーバーロードを提供できます-これを行う方法は、コンパイラーとプラットフォームによって少し異なります-これは少しの投資になります-しかし、それは長期的には報われるかもしれません。望ましい機能リストは、dmallocとelectricfence、および驚くほど優れた本「WritingSolidCode」から見覚えがあるはずです。
- 歩哨値:最大配置要件を尊重して、各割り当ての前後にもう少しスペースを確保します。魔法数で埋める(バッファオーバーフローとアンダーフロー、および時折「ワイルド」ポインタをキャッチするのに役立ちます)
- alloc fill:新しい割り当てを0以外の魔法の値で埋めます-Visual C ++は、デバッグビルドですでにこれを実行します(初期化されていない変数の使用をキャッチするのに役立ちます)
- フリーフィル:解放されたメモリを0以外の魔法の値で埋めます。ほとんどの場合、逆参照された場合にセグメンテーションフォールトをトリガーするように設計されています(ダングリングポインターをキャッチするのに役立ちます)
- 遅延解放:解放されたメモリをしばらくヒープに戻さないでください。解放されたままにしておきますが、使用できません(より多くのダングリングポインタをキャッチし、近接するダブルフリーをキャッチします)
- 追跡:割り当てが行われた場所を記録できると便利な場合があります
ローカルの自作システム(埋め込みターゲットの場合)では、実行時のオーバーヘッドがはるかに高いため、追跡を他のほとんどのものから分離していることに注意してください。
これらの割り当て関数/演算子をオーバーロードするその他の理由に興味がある場合は、「グローバル演算子を新規にオーバーロードして削除する理由はありますか?」に対する私の回答をご覧ください。; 恥知らずな自己宣伝はさておき、ヒープ破損エラーの追跡に役立つ他の手法や、他の適用可能なツールをリストします。
MSが使用するalloc/free / fence値を検索するときに、ここで自分の答えを見つけ続けるので、Microsoftのdbgheap塗りつぶし値をカバーする別の答えがあります。