Heim  >  Artikel  >  Backend-Entwicklung  >  Warum wird das Löschen eines Arrays abgeleiteter Objekte mit einem Basiszeiger als undefiniertes Verhalten in C betrachtet?

Warum wird das Löschen eines Arrays abgeleiteter Objekte mit einem Basiszeiger als undefiniertes Verhalten in C betrachtet?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-01 03:42:02307Durchsuche

Why is deleting an array of derived objects with a base pointer considered Undefined Behavior in C  ?

Warum ist es undefiniertes Verhalten, ein Array abgeleiteter Objekte mit einem Basiszeiger zu löschen?

Der C-Standard 5.3.5 [ expr.delete] gibt an, dass im Fall von „Array löschen“ undefiniertes Verhalten auftritt, wenn der dynamische Typ des zu löschenden Objekts von seinem statischen Typ abweicht. Dies bedeutet, dass der folgende Codeausschnitt undefiniertes Verhalten aufruft:

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

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

Begründung für undefiniertes Verhalten

Ein „Löschen []“-Vorgang erfordert einen Zeiger auf das erste Element eines Arrays. Wenn Sie jedoch einen Basiszeiger auf ein Array abgeleiteter Objekte verwenden, verweist der Zeiger tatsächlich auf das Basisunterobjekt des ersten Elements. Daher würde die Operation „delete []“ versuchen, das Basis-Unterobjekt anstelle des ersten Elements des Arrays zu löschen, was falsch ist.

Um in diesem Fall das richtige Verhalten zu erzwingen, müsste der Elementtyp des Arrays abgerufen werden Array und führt einen Dynamic_cast für diesen Typ durch. Dies würde jedoch zu unnötigem Overhead für jedes polymorphe Array führen, selbst wenn kein Polymorphismus verwendet wird.

Außerdem ist der Zeiger „p“ selbst nur von begrenztem Nutzen, da er nur auf ein Basisunterobjekt zeigt. Gängige Array-Operationen wie „p[i]“ (für i > 0) wären nicht möglich.

Fazit

Das undefinierte Verhalten für „delete [] „ mit einem Basiszeiger auf ein Array abgeleiteter Objekte ist eine bewusste Entwurfsentscheidung, die:

  • die Effizienz für legitime Verwendungen von Arrays beibehält
  • bei Bedarf die Implementierung polymorpher Arrays ermöglicht
  • Verhindert falsche Array-Operationen mit abgeleiteten Zeigern

Das obige ist der detaillierte Inhalt vonWarum wird das Löschen eines Arrays abgeleiteter Objekte mit einem Basiszeiger als undefiniertes Verhalten in C betrachtet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn