Re: delete[] und cast

Autor: Robert Schiele <rschiele_at_uni-mannheim.de>
Datum: 15.01.2005
On Sat, Jan 15, 2005 at 06:53:26PM +0100, Roland Schulz wrote:
> Hallo,
> 
> wird in den folgenden zwei Zeilen der Speicher korrekt freigegeben?
> int* p = new int[10];
> delete[] (char*) p;
> 
> Anders gefragt: Wird die Länge in Bytes oder in Elementen gespeichert?

Was die Speicherverwaltung angelegt, ist das kein Problem, aber gegebenenfalls
wird der falsche Destruktor aufgerufen, was in diesem Fall kein konkretes
Problem ist, da primitive Typen keinen Destruktor haben.

> Hintergrund: Ich habe eine virtuelle Methode die in verschiedenen 
> Implementierungen Arrays verschiedenen Typs zurückgibt. Diese Arrays sollen 
> gelöscht werden, obwohl halt nicht klar ist von welchem Typ sie sind.

Der Code hat einen Designfehler: Asymmetrische Speicherverwaltung:
Angeforderter Speicher sollte immer auf der gleichen logischen Ebene wieder
freigegeben werden, wie er angefordert wurde. Wenn also in deinem Beispiel
eine Klasse eine virtuelle Methode zur Verfuegung stellt, welche Speicher
"unbekannten" Typs anfordert, sollte sie auch eine Methode anbieten, die
diesen wieder freigibt.

Aber abgesehen davon ist mir nicht klar, warum du das Array nicht einfach
kapselst, um die Typsicherheit zu erhalten. Und wenn du es nicht vermeiden
kannst, einen Typ casten zu muessen, solltest du unbedingt auf C-style-Casts
verzichten, und stattdessen die spezifischeren C++-Varianten benutzen.

Robert

-- 
Robert Schiele			Tel.: +49-621-181-2214
Dipl.-Wirtsch.informatiker	mailto:rschiele@uni-mannheim.de


Received on Sat Jan 15 21:30:47 2005

Dieses Archiv wurde generiert von hypermail 2.1.8.
Zurück zur UUGRN-Homepage.