Heim > Backend-Entwicklung > C++ > Hauptteil

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

Patricia Arquette
Freigeben: 2024-10-30 07:31:27
Original
713 Leute haben es durchsucht

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!