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