ホームページ  >  記事  >  バックエンド開発  >  ベース ポインターを介した派生オブジェクトの配列の削除が C で未定義の動作になるのはなぜですか?

ベース ポインターを介した派生オブジェクトの配列の削除が C で未定義の動作になるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-30 07:31:27699ブラウズ

Why is Deleting an Array of Derived Objects via a Base Pointer Undefined Behavior in C  ?

ベース ポインターを介した派生オブジェクトの配列の削除が未定義になる理由

C では、次の場合、配列の削除の動作は未定義になります。オブジェクトの動的タイプは静的タイプとは異なります。これは、C 03 標準 (5.3.5 [expr.delete] p3) で概説されています。「2 番目の選択肢 (配列の削除) では、削除されるオブジェクトの動的タイプがその静的タイプと異なる場合、動作は未定義です」 ."

説明のために、次のコード スニペットを考えてみましょう。

<code class="cpp">struct B { virtual ~B() {} };
struct D : B {};

B* p = new D[20];
delete[] p; // undefined behavior</code>

ベース ポインターを使用して派生オブジェクトの配列を削除するのは直感的に見えるかもしれませんが、標準ではこれが未定義の動作として指定されています。 。これは、ベース ポインタ p が、最初の要素そのものではなく、配列内の最初の要素のベース サブオブジェクトを指しているためです。

配列のポリモーフィックな削除を実装するには、要素の型を取得し、動的キャストを実行する必要があります。次に単純な delete[] を実行します。ただし、ポリモーフィズムが利用されていない場合でも、これにより不要なオーバーヘッドが発生します。

したがって、未定義の動作や不要なオーバーヘッドを避けるために、配列はポリモーフィズム的に動作できないことを覚えておくことが重要です。代わりに、ポリモーフィックな動作が必要な場合は、個別に実装できます。

要約:

  • 配列は、正当な使用に対するペナルティを回避するためにポリモーフィックな動作をサポートしません。
  • 必要に応じて、配列のポリモーフィックな削除を個別に実装できます。

以上がベース ポインターを介した派生オブジェクトの配列の削除が C で未定義の動作になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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