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:
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!