削除後の C でのポインターの動作
C では、ポインターを削除すると、ポインターが指すメモリーの割り当てが解除されます。ただし、その削除されたメモリを指すポインタの動作は、C バージョンに応じて未定義または実装定義になります。
次のコードを考えてみましょう。
<code class="cpp">A* a = new A(); A* b = a; delete a; A* c = a; // Assuming undefined or implementation-defined in C++11 A* d = b; // Supposed to be legal</code>
Reading Value of削除されたポインタのコピー (b)
C 11 では、a が削除された後に b の値を読み取ります。削除は未定義の動作です。ただし、C 14 では実装定義です。これは、a が削除されると、ポインタ b 自体が「無効なポインタ値」になるためです。
実装定義の動作
C 14 では、無効なポインタ値を使用していますコピーを含む、実装定義の動作があります。これは、そのような場合にどうするかをコンパイラーが決定できることを意味します。一部の実装では、実行時エラーが生成される場合がありますが、他の実装では、操作は許可されても、その後ポインターが使用されると未定義の動作が発生する場合があります。
合法か未定義ですか?
したがって、両方の A* c = a;そしてA* d = b;コピーされたポインタ値 (b) は無効なポインタ値とみなされ、その使用は実装の定義に従います。
以上がC でポインタが指すメモリを削除すると、ポインタはどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。