Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ist das Löschen eines Arrays abgeleiteter Objekte über einen Basiszeiger ein undefiniertes Verhalten in C?

Warum ist das Löschen eines Arrays abgeleiteter Objekte über einen Basiszeiger ein undefiniertes Verhalten in C?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-30 07:31:27700Durchsuche

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

Warum das Löschen eines Arrays abgeleiteter Objekte über einen Basiszeiger undefiniert sein kann

In C ist das Verhalten beim Löschen eines Arrays undefiniert, wenn Der dynamische Typ des Objekts unterscheidet sich von seinem statischen Typ. Dies ist im C 03-Standard (5.3.5 [expr.delete] p3) beschrieben: „Wenn in der zweiten Alternative (Array löschen) der dynamische Typ des zu löschenden Objekts von seinem statischen Typ abweicht, ist das Verhalten undefiniert.“ ."

Betrachten Sie zur Veranschaulichung den folgenden Codeausschnitt:

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

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

Obwohl es intuitiv erscheinen mag, ein Array abgeleiteter Objekte mithilfe eines Basiszeigers zu löschen, spezifiziert der Standard dies als undefiniertes Verhalten . Dies liegt daran, dass der Basiszeiger p auf das Basisunterobjekt des ersten Elements im Array zeigt und nicht auf das erste Element selbst.

Die Implementierung des polymorphen Löschens von Arrays würde das Abrufen des Elementtyps, die Durchführung einer dynamischen Umwandlung, und dann ein einfaches delete[] durchführen. Dies würde jedoch selbst dann unnötigen Overhead verursachen, wenn kein Polymorphismus verwendet wird.

Daher ist es wichtig zu bedenken, dass sich Arrays nicht polymorph verhalten können, um undefiniertes Verhalten und unnötigen Overhead zu vermeiden. Wenn stattdessen polymorphes Verhalten gewünscht ist, kann es separat implementiert werden.

Zusammenfassung:

  • Arrays unterstützen kein polymorphes Verhalten, um eine Bestrafung legitimer Verwendungen zu vermeiden.
  • Das polymorphe Löschen von Arrays kann bei Bedarf separat implementiert werden.

Das obige ist der detaillierte Inhalt vonWarum ist das Löschen eines Arrays abgeleiteter Objekte über einen Basiszeiger ein undefiniertes Verhalten in C?. 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