無効なポインターが未定義の動作につながることは知っていますが、ポインターが有効かどうかを free はどのように判断しますか?
フリーリストの各ブロックの先頭にチェックサムのようなものはありますか? 何かのようなもの:
if((*ptr) == 'CHECKSUM'))
free
else
do something undefined
無効なポインターが未定義の動作につながることは知っていますが、ポインターが有効かどうかを free はどのように判断しますか?
唯一のチェックは、ポインターが null かどうかです。null ポインターの場合、free (仕様による) は何もしません。
それ以外の場合は、 、、またはfree
によって割り当てられたメモリであると仮定して、メモリを「解放」しようとします。これにより、何かが発生する可能性があります (通常は悪いこと) - したがって、「未定義の動作」。malloc
calloc
realloc
あるかもしれません。しかし、一般的にはそうではありません。多くの実装でfree
は、その入力が有効であると仮定して、それが正しいかのようにすぐに進みます。それを行うことは完全にその権利の範囲内です。
これが動作が「未定義」である理由です。ポインターが有効でない場合に何が起こるかを予測することは不可能です。free
の操作中および/または後で他のヒープ操作が実行されたときに、メモリのランダムな領域が破棄される可能性があります。無関係なコードで予期しない動作を引き起こす可能性があります。プログラムは ですぐにクラッシュするfree
か、後で明らかに無関係な場所でクラッシュする可能性があります。
それはわからない。有効であり、適切に動作すると想定しているだけです。
この仮定が間違っていた場合、重要な構造の破壊が発生した可能性があり、その後何が起こるかはわかっていません。したがって、未定義の動作。
ポインターが無効であるため、ポインターが有効でfree
返されたかのように「簿記情報」を読み取ろうとしmalloc
ます。これにより、通常、無効なポインターが指すランダムなアドレスが解放され、破損やクラッシュなどが発生します。