„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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++?

Veröffentlicht am 23.12.2024
Durchsuche:285

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:

struct B { virtual ~B() {} };
struct D : B {};

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

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, das Durchführen einer dynamischen Umwandlung erfordern. und dann ein einfaches delete[] durchführen. Dies würde jedoch auch dann unnötigen Overhead verursachen, wenn kein Polymorphismus verwendet wird.

Um undefiniertes Verhalten und unnötigen Overhead zu vermeiden, ist es daher wichtig, sich daran zu erinnern, dass sich Arrays nicht polymorph verhalten können. 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.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3