ホームページ  >  記事  >  バックエンド開発  >  削除されたポインターから派生したポインターの使用は C で有効ですか?

削除されたポインターから派生したポインターの使用は C で有効ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-01 06:30:30441ブラウズ

Is using a pointer derived from a deleted pointer valid in C  ?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。