ベース ポインターを介した派生オブジェクトの配列の削除が未定義になる理由
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 サイトの他の関連記事を参照してください。