削除後の C 内のポインター
C の次のコード スニペットを考えてみましょう。
<code class="cpp">A* a = new A(); A* b = a; delete a; A* c = a; // Undefined behavior in C++11 A* d = b; // Potentially legal, but uncertain</code>
このコードは、質問: 元のポインターが削除された後に、コピーされたポインターの値にアクセスするとどうなりますか?
C 11 では、削除されたポインターの値にアクセスすると、未定義の動作が発生します。これはポインター a と b の両方に当てはまります。 a の値を c にコピーすることも、a が割り当て解除されたメモリを指すため、未定義です。
ただし、C 14 では、動作は実装定義になります。標準では次のように指定されています。
「無効なポインタ値を介した間接指定と、無効なポインタ値を割り当て解除関数に渡す場合の動作は未定義です。無効なポインタ値のその他の使用には、実装定義の動作があります。」
したがって、C 14 では、a のコピーである b の値へのアクセスも実装定義です。これは未定義の動作につながる可能性がありますが、特定の実装によって異なる方法で処理される可能性もあります。
要約すると、両方とも A* c = a; となります。そしてA* d = b;これは、ポインタ a と b の両方が、削除操作後に無効なメモリを指しているためです。
以上がオリジナルが削除された後、C でコピーされたポインターはどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。