g++ ハッカーの皆さん、次の質問があります。
オブジェクトの一部のデータが欠陥のあるプログラムによって上書きされた場合、プログラムは最終的にそのオブジェクトの破壊に失敗し、二重解放エラーが発生するのはなぜですか? データが破損しているかどうかをどのように判断しますか? そして、なぜダブルフリーが発生するのでしょうか?
通常、オブジェクトのメモリが上書きされるのではなく、オブジェクトの外部のメモリの一部が上書きされます。これが malloc の制御構造にヒットした場合、free はそれらにアクセスするとパニックになり、破損した構造に基づいて奇妙なことをしようとします。
オブジェクトメモリをばかげたもので上書きするだけなら、malloc/free が知る方法はありません。プログラムがクラッシュする可能性がありますが、他の理由があります。
valgrindを見てください。これは、CPU をエミュレートし、異常がないかすべてのメモリ アクセスを監視するツールです (malloc の制御構造を上書きしようとするなど)。使い方は非常に簡単です。ほとんどの場合、valgrind 内valgrind
でシェルの先頭に追加してプログラムを開始するだけで、多くの手間が省けます。
C++ に関して: new を delete と組み合わせて使用し、new[] を delete[] と組み合わせて使用することを常に確認してください。それらを決して混同しないでください。多くの場合、あなたが説明していることと同様の悪いことが起こります(ただし、valgrind は警告します)。