3

無効なポインターが未定義の動作につながることは知っていますが、ポインターが有効かどうかを free はどのように判断しますか?

フリーリストの各ブロックの先頭にチェックサムのようなものはありますか? 何かのようなもの:

if((*ptr) == 'CHECKSUM'))
  free
else
  do something undefined
4

4 に答える 4

5

無効なポインターが未定義の動作につながることは知っていますが、ポインターが有効かどうかを free はどのように判断しますか?

唯一のチェックは、ポインターが null かどうかです。null ポインターの場合、free (仕様による) は何もしません。

それ以外の場合は、 、、またはfreeによって割り当てられたメモリであると仮定して、メモリを「解放」しようとします。これにより、何かが発生する可能性があります (通常は悪いこと) - したがって、「未定義の動作」。malloccallocrealloc

于 2012-06-12T16:38:00.303 に答える
4

あるかもしれません。しかし、一般的にはそうではありません。多くの実装でfreeは、その入力が有効であると仮定して、それが正しいかのようにすぐに進みます。それを行うことは完全にその権利の範囲内です。

これが動作が「未定義」である理由です。ポインターが有効でない場合に何が起こるかを予測することは不可能です。freeの操作中および/または後で他のヒープ操作が実行されたときに、メモリのランダムな領域が破棄される可能性があります。無関係なコードで予期しない動作を引き起こす可能性があります。プログラムは ですぐにクラッシュするfreeか、後で明らかに無関係な場所でクラッシュする可能性があります。

于 2012-06-12T16:41:03.257 に答える
2

それはわからない。有効であり、適切に動作すると想定しているだけです。

この仮定が間違っていた場合、重要な構造の破壊が発生した可能性があり、その後何が起こるかはわかっていません。したがって、未定義の動作。

于 2012-06-12T16:38:31.963 に答える
1

ポインターが無効であるため、ポインターが有効でfree返されたかのように「簿記情報」を読み取ろうとしmallocます。これにより、通常、無効なポインターが指すランダムなアドレスが解放され、破損やクラッシュなどが発生します。

于 2012-06-12T16:45:43.020 に答える