Der delete[]Operator wird zum Löschen von Arrays verwendet. Der deleteOperator wird zum Löschen von Nicht-Array-Objekten verwendet. Es ruft operator delete[]bzw. operator deletefunktioniert, 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 newauf 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_twird, 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 newObjekt, das ein Nicht-Array-Objekt erstellt, wird operator newin 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 deletein dieser Klasse oder der globaler operator deleteverwendet. Wenn eine Basisklasse übergeben wurde, wird der Destruktor des tatsächlichen Objekttyps aufgerufen und der operator deletein dieser Klasse gefundene wird verwendet, oder wenn keine vorhanden ist, wird ein globaler operator deleteaufgerufen. Wenn der operator deletein der Klasse einen zweiten Parameter vom Typ hat size_t, erhält er die Anzahl der Elemente, die freigegeben werden sollen.