ホームページ > バックエンド開発 > C++ > C でポインターが削除された後、同じオブジェクトを参照しているポインターはどうなりますか?

C でポインターが削除された後、同じオブジェクトを参照しているポインターはどうなりますか?

Susan Sarandon
リリース: 2024-11-01 11:29:30
オリジナル
852 人が閲覧しました

What Happens to Pointers Referencing the Same Object After One is Deleted in C  ?

C の解放されたメモリへのポインター

ポインターを削除した後、同じオブジェクトを参照する他のポインターの有効性に関して混乱が生じます。この記事の目的は、C でのこの動作を明確にすることです。

次のコードを考えてみましょう:

<code class="cpp">A* a = new A();
A* b = a;

delete a;

A* c = a; // Illegal (C++11)
A* d = b; // Debatable legality

// Points to deallocated memory, Undefined in C++11
A* aAddr = &a;</code>
ログイン後にコピー

C 11 の動作:

  • 代入以前に削除されたポインタ a から c に移動すると、a は無効なポインタ値になっているため、未定義の動作が発生します。
  • ただし、d は削除前に作成された a のコピーを指します。 b の値の読み取りは割り当て解除されたメモリ位置を指しますが、このアクションは実装定義です。

C 14 動作:

  • への代入無効なポインタ a からの c と d は両方とも未定義の動作を引き起こします。
  • ここで b を使用して実行されるように、無効なポインタの値をコピーすることも実装定義の動作です。

C 11 標準によれば、無効なポインター値を使用すると (コピーを含む)、未定義の動作が発生します。 C 14 では、このような操作は実装定義の動作を持ちます。つまり、動作はコンパイラやオペレーティング システムによって異なる可能性があります。

したがって、C 11 と C 14 の両方で、以前に定義されたポインタの使用を避けることが重要です。削除されるか、割り当て解除されたメモリを参照します。そうすると、予測できない、潜在的に誤った動作が発生する可能性があります。

以上がC でポインターが削除された後、同じオブジェクトを参照しているポインターはどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート