Der delete[]
Operator wird zum Löschen von Arrays verwendet. Der delete
Operator wird zum Löschen von Nicht-Array-Objekten verwendet. Es ruft operator delete[]
bzw. operator delete
funktioniert, um den Speicher zu löschen, den das Array oder Nicht-Array-Objekt belegt hat, nachdem (eventuell) die Destruktoren für die Elemente des Arrays oder das Nicht-Array-Objekt aufgerufen wurden.
Das Folgende zeigt die Beziehungen:
typedef int array_type[1];
// create and destroy a int[1]
array_type *a = new array_type;
delete [] a;
// create and destroy an int
int *b = new int;
delete b;
// create and destroy an int[1]
int *c = new int[1];
delete[] c;
// create and destroy an int[1][2]
int (*d)[2] = new int[1][2];
delete [] d;
Für das new
, das ein Array erstellt (also entweder das new type[]
oder new
auf ein Array-Typ-Konstrukt angewendet), sucht der Standard operator new[]
in der Elementtypklasse des Arrays oder im globalen Bereich nach einem und übergibt die angeforderte Speichermenge. Es kann mehr anfordern, als N * sizeof(ElementType)
es möchte (zum Beispiel um die Anzahl der Elemente zu speichern, damit es später beim Löschen weiß, wie viele Destruktoraufrufe ausgeführt werden müssen). Wenn die Klasse deklariert, operator new[]
dass zusätzlich zur Speichermenge ein anderer akzeptiert size_t
wird, erhält dieser zweite Parameter die Anzahl der zugewiesenen Elemente - er kann dies für jeden gewünschten Zweck verwenden (Debuggen usw.).
Für das new
Objekt, das ein Nicht-Array-Objekt erstellt, wird operator new
in der Klasse des Elements oder im globalen Bereich nach einem gesucht. Es übergibt die angeforderte Speichermenge (genau sizeof(T)
immer).
Für die delete[]
wird der Elementklassentyp der Arrays untersucht und ihre Destruktoren aufgerufen. Die verwendete operator delete[]
Funktion ist die in der Klasse des Elementtyps oder, falls keine vorhanden ist, im globalen Bereich.
Für die delete
, wenn der übergebene Zeiger eine Basisklasse des tatsächlichen Objekttypen ist, muss die Basisklasse einen virtuellen Destruktor hat (sonst Verhalten ist nicht definiert). Wenn es sich nicht um eine Basisklasse handelt, wird der Destruktor dieser Klasse aufgerufen und ein operator delete
in dieser Klasse oder der globaler operator delete
verwendet. Wenn eine Basisklasse übergeben wurde, wird der Destruktor des tatsächlichen Objekttyps aufgerufen und der operator delete
in dieser Klasse gefundene wird verwendet, oder wenn keine vorhanden ist, wird ein globaler operator delete
aufgerufen. Wenn der operator delete
in der Klasse einen zweiten Parameter vom Typ hat size_t
, erhält er die Anzahl der Elemente, die freigegeben werden sollen.