Was ist der Unterschied zwischen delete
und delete[]
Operatoren in C ++?
c++
memory-management
delete-operator
Shreyasva
quelle
quelle
vector<>
wann immer ich kann , anstelle eines Arrays.std::unique_ptr<int>(new int[3])
weil esdelete
auf dem Array regulär aufruft, was ein undefiniertes Verhalten ist. Stattdessen müssen Siestd::unique_ptr<int[]>
Antworten:
Der
delete
Operator gibt Speicher frei und ruft den Destruktor für ein einzelnes Objekt auf, mit dem erstellt wurdenew
.Der
delete []
Operator gibt Speicher frei und ruft Destruktoren für ein Array von Objekten auf, mit denen erstellt wurdenew []
.Die Verwendung
delete
eines vonnew []
oderdelete []
eines von zurückgegebenen Zeigersnew
führt zu einem undefinierten Verhalten.quelle
Der
delete[]
Operator wird zum Löschen von Arrays verwendet. Derdelete
Operator wird zum Löschen von Nicht-Array-Objekten verwendet. Es ruftoperator 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:
Für das
new
, das ein Array erstellt (also entweder dasnew type[]
odernew
auf ein Array-Typ-Konstrukt angewendet), sucht der Standardoperator new[]
in der Elementtypklasse des Arrays oder im globalen Bereich nach einem und übergibt die angeforderte Speichermenge. Es kann mehr anfordern, alsN * 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 akzeptiertsize_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, wirdoperator new
in der Klasse des Elements oder im globalen Bereich nach einem gesucht. Es übergibt die angeforderte Speichermenge (genausizeof(T)
immer).Für die
delete[]
wird der Elementklassentyp der Arrays untersucht und ihre Destruktoren aufgerufen. Die verwendeteoperator 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 einoperator delete
in dieser Klasse oder der globaleroperator delete
verwendet. Wenn eine Basisklasse übergeben wurde, wird der Destruktor des tatsächlichen Objekttyps aufgerufen und deroperator delete
in dieser Klasse gefundene wird verwendet, oder wenn keine vorhanden ist, wird ein globaleroperator delete
aufgerufen. Wenn deroperator delete
in der Klasse einen zweiten Parameter vom Typ hatsize_t
, erhält er die Anzahl der Elemente, die freigegeben werden sollen.quelle
Dies ist die grundlegende Verwendung von Allocate / DE-Allocate Pattern 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
delete
und hinzufügendelete[]
1)
delete
wird verwendet, um die Zuweisung von Speicher für ein einzelnes Objekt aufzuheben2)
delete[]
wird verwendet, um die Zuordnung des für ein Array von Objekten zugewiesenen Speichers aufzuhebenWenn wir sagen
new ABC[100]
, kann der Compiler die Informationen darüber abrufen, wie viele Objekte zugewiesen werden müssen (hier sind es 100), und ruft den Konstruktor für jedes der erstellten Objekte aufWenn wir dies jedoch nur
delete ptr
für diesen Fall verwenden, weiß der Compiler nicht, auf wie viele Objekte erptr
verweist, und ruft am Ende den Destruktor auf und löscht den Speicher für nur ein Objekt (wobei der Aufruf von Destruktoren und die Freigabe der verbleibenden 99 Objekte verbleiben). Daher kommt es zu einem Speicherverlust.also müssen wir
delete [] ptr
in diesem Fall verwenden.quelle
free()
dies und das. Wenn Sie ein Pseudo-Destruktor-Muster verwenden, müssen Sie es für jedes Objekt mithilfe einerfor
Schleife einmal aufrufen .Die Operatoren
delete
unddelete []
werden jeweils verwendet, um die mitnew
und erstellten Objekte zu zerstören undnew[]
zu dem zugewiesenen Speicher zurückzukehren, der dem Speichermanager des Compilers zur Verfügung steht.Mit erstellte Objekte
new
müssen unbedingt mit zerstört werdendelete
, und die mit erstellten Arraysnew[]
sollten mit gelöscht werdendelete[]
.quelle
Als ich diese Frage stellte, war meine eigentliche Frage: "Gibt es einen Unterschied zwischen den beiden? Muss die Laufzeit nicht Informationen über die Arraygröße behalten, und kann sie dann nicht sagen, welche wir meinen?" Diese Frage erscheint nicht in "verwandten Fragen". Um nur Leuten wie mir zu helfen, hier die Antwort darauf: "Warum brauchen wir überhaupt den Operator delete []?"
quelle
delete
wird für einen einzelnen Zeiger verwendet unddelete[]
zum Löschen eines Arrays über einen Zeiger. Dies könnte Ihnen helfen, besser zu verstehen.quelle
Naja .. vielleicht denke ich es ist nur explizit. Der Operator
delete
und der Operatordelete[]
werden unterschieden, aber derdelete
Operator kann auch das Array freigeben.Und bereits überprüft, hat dieser Code kein Speicherleck.
quelle