* glibc detected ./load: double free or corruption (!prev): ADDRESS **
glibc を使用する場合、二重解放していることをどのように認識しますか? 私が malloc して解放したものはすべて追跡されますか? free はどのくらいのスペースを解放するかをどのように知っているかのようなメタデータに含まれていますか ( free はどのくらい解放するかをどのように知っていますか? )
* glibc detected ./load: double free or corruption (!prev): ADDRESS **
glibc を使用する場合、二重解放していることをどのように認識しますか? 私が malloc して解放したものはすべて追跡されますか? free はどのくらいのスペースを解放するかをどのように知っているかのようなメタデータに含まれていますか ( free はどのくらい解放するかをどのように知っていますか? )
何かを malloc すると、メモリ ブロックへのポインターが取得されます。それはもうご存知ですよね^^。メモリ管理は、ブロックの前に (たとえば、ブロックのサイズを追跡する) (隠し) ヘッダーも予約します。free 操作では、ヘッダーも消去されます。2 回解放すると、ヘッダーは 2 回目の解放では無効になります。したがって、検出。
C 言語標準では、ポインターを 2 回解放することは未定義の動作であると規定されています。glibc で見られるのは、メッセージが発行される、この未定義の動作の 1 つの特定のケース (役立つもの) です。ほとんどのアロケーターは、割り当てられたものを追跡し、解放されたものを追跡できる量までは追跡します。しかし、この振る舞いを当てにすることはできません。
AC プログラムは、黙ってクラッシュしたり、状況を無視したり (または必要と思われるその他のアクション) することもできます。