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