webentwicklung-frage-antwort-db.com.de

Delete vs Delete [] -Operatoren in C ++

Was ist der Unterschied zwischen delete und delete[] Operatoren in C++?

106
shreyasva

Der Operator delete teilt Speicher auf und ruft den Destruktor für ein einzelnes Objekt auf, das mit new erstellt wurde.

Der Operator delete [] Teilt Speicher auf und ruft Destruktoren für ein Array von Objekten auf, die mit new [] Erstellt wurden.

Die Verwendung von delete für einen Zeiger, der von new [] Oder delete [] Für einen von new zurückgegebenen Zeiger zurückgegeben wird, führt zu undefiniertem Verhalten.

125
Nick Meyer

Der Operator delete[] Wird zum Löschen von Arrays verwendet. Der Operator delete wird zum Löschen von Nicht-Array-Objekten verwendet. Sie ruft die Funktionen operator delete[] Und operator delete Auf, 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 ein new, das ein Array erstellt (also entweder das new type[] Oder new, das auf ein Arraytypkonstrukt angewendet wird), sucht der Standard nach einem operator new[] In die Elementtypklasse des Arrays oder im globalen Bereich und übergibt die angeforderte Speichermenge. Es kann mehr als N * sizeof(ElementType) anfordern, wenn es möchte (zum Beispiel um die Anzahl der Elemente zu speichern, damit es später beim Löschen weiß, wie viele Destruktor-Aufrufe zu erledigen sind). Wenn die Klasse einen operator new[] Deklariert, der zusätzlich zur Speicherkapazität einen weiteren size_t Akzeptiert, erhält dieser zweite Parameter die Anzahl der zugewiesenen Elemente - er kann diesen für jeden gewünschten Zweck verwenden (Debugging, etc...).

Für ein new, das ein Nicht-Array-Objekt erstellt, wird in der Klasse des Elements oder im globalen Bereich nach einem operator new Gesucht. Er übergibt die angeforderte Speichermenge (immer genau sizeof(T)).

Für ein delete[] Untersucht es den Elementklassentyp des Arrays und ruft dessen Destruktoren auf. Die verwendete Funktion operator delete[] Ist die in der Klasse des Elementtyps oder, falls keine vorhanden ist, im globalen Bereich.

Wenn für ein delete der übergebene Zeiger eine Basisklasse des tatsächlichen Objekttyps ist, muss die Basisklasse über einen virtuellen Destruktor verfügen (andernfalls ist das Verhalten nicht definiert). Wenn es sich nicht um eine Basisklasse handelt, wird der Destruktor dieser Klasse aufgerufen und ein operator delete In dieser Klasse oder das globale operator delete Verwendet. Wenn eine Basisklasse übergeben wurde, wird der Destruktor des tatsächlichen Objekttyps aufgerufen, und das in dieser Klasse gefundene operator delete Wird verwendet, oder wenn es keines gibt, wird ein globales operator delete Aufgerufen. Wenn das operator delete In der Klasse einen zweiten Parameter vom Typ size_t Hat, erhält es die Anzahl der Elemente, deren Zuordnung aufgehoben werden soll.

Dies ist die grundlegende Verwendung des Zuweisungs-/DE-Zuweisungsmusters in c ++ malloc/free, new/delete, new []/delete []

Wir müssen sie entsprechend verwenden. Aber ich möchte dieses besondere Verständnis für den Unterschied zwischen Löschen und Löschen hinzufügen []

1) Löschen wird verwendet, um den für einzelnes Objekt zugewiesenen Speicher freizugeben

2) delete [] wird verwendet, um den für Array von Objekten zugewiesenen Speicher freizugeben

Klasse ABC {}

ABC * ptr = neues ABC [100]

wenn wir new [100] .. sagen, kann der Compiler die Informationen darüber abrufen, wie viele Objekte zugeordnet werden müssen (hier sind es 100) und ruft den Konstruktor für jedes der erstellten Objekte auf

wenn wir aber in diesem Fall einfach delete ptr verwenden, weiß der Compiler nicht, auf wie viele Objekte ptr verweist, und ruft am Ende nur den Destruktor auf und löscht den Speicher 1 Objekt (wobei der Aufruf von Destruktoren und die Freigabe der verbleibenden 99 Objekte verlassen wird). Daher kommt es zu einem Speicherverlust

in diesem Fall müssen wir delete [] ptr verwenden.

13
ravs2627

Die Operatoren delete und delete [] Werden verwendet, um die mit new und new[] Erstellten Objekte zu zerstören und zu dem zugewiesenen Speicher zurückzukehren, der dem Speichermanager des Compilers zur Verfügung steht .

Objekte, die mit new erstellt wurden, müssen unbedingt mit delete zerstört werden, und die mit new[] Erstellten Arrays sollten mit delete[] Gelöscht werden.

4
san983

Als ich diese Frage stellte, lautete meine eigentliche Frage: "Gibt es einen Unterschied zwischen den beiden? Muss die Laufzeit nicht Informationen über die Array-Größe speichern, und kann sie nicht sagen, welche wir meinen?" Diese Frage taucht nicht in "verwandten Fragen" auf. Um Leuten wie mir zu helfen, hier die Antwort auf diese Frage: "Warum brauchen wir überhaupt den Operator delete []?"

1
Ekalavya