C での削除後のポインター : a と b の複雑なケース
C ポインターの世界では、割り当てられたポインターを削除する行為は、メモリを削除すると、そのメモリを指すポインタの有効性について疑問が生じます。次のシナリオを考えてみましょう。
<code class="cpp">A* a = new A(); A* b = a; delete a; A* c = a; // illegal in C++11 A* d = b; // legal?</code>
質問の核心は、a が削除された後にポインタ b の値を使用する妥当性を判断することにあります。
の運命無効なポインター: C 11 での未定義の動作、C 14 で実装定義
C 11 では、削除されたポインター (a) の値にアクセスすると、未定義の動作が発生します。ただし、削除されたポインタから派生したポインタ (b) の使用には微妙な状況が生じます。
C 11 では、両方の c = a;そして d = b;未定義の動作とみなされます。これは、a と b は両方とも、割り当て解除されたストレージを指しているため、「無効なポインター値」と見なされるためです。無効なポインターに対して操作を実行しようとする試みは、明示的に未定義です。
C 14 の実装定義の複雑さ
C 14 では、このシナリオに微妙な変更が導入されています。改訂された規格によれば、「無効なポインタ値の使用」には「値のコピー」が含まれます。したがって、C 14 では、c と d への代入は両方とも実装定義とみなされます。
この変更の背後にある理由は、無効なポインター値をコピーすると、特定の実装で実行時エラーが発生する可能性があるためです。標準では賢明にも、そのようなケースの処理は実装に任せています。
結論として、a が削除された後に b を使用することが合法かどうかは、使用されている C バージョンに依存します。 C 11 は両方の c = a とみなします。そして d = b;一方、C 14 は実装に責任を移し、結果は標準で未指定のままです。
以上が削除されたポインターから派生したポインターの使用は C で有効ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。