Mögliches Duplizieren:
delete vs delete [] - Operatoren in C++
Ich habe eine Klasse geschrieben, die zwei Zeiger enthält, einer ist char* color_
und einer in vertexesset* vertex_
, wobei vertexesset
eine Klasse ist, die ich erstellt habe. Im Destractor habe ich beim Start geschrieben
delete [] color_;
delete [] vertex_;
Wenn es um den Destruktor ging, gab es einen Segmentierungsfehler.
Dann habe ich den Destruktor geändert in:
delete [] color_;
delete vertex_;
Und jetzt funktioniert es gut. Was ist der Unterschied zwischen den beiden?
Sie delete []
, wenn Sie einen Array-Typ new
eden, und delete
, wenn Sie dies nicht getan haben. Beispiele:
typedef int int_array[10];
int* a = new int;
int* b = new int[10];
int* c = new int_array;
delete a;
delete[] b;
delete[] c; // this is a must! even if the new-line didn't use [].
delete
und delete[]
sind nicht dasselbe! Wikipedia erklärt dies wenn auch kurz. Kurz gesagt, delete []
ruft den Destruktor für jedes Element im zugewiesenen Array auf, während delete
davon ausgeht, dass Sie genau eine Instanz haben. Sie sollten Arrays mit new foo[]
zuweisen und sie mit delete[]
löschen. Verwenden Sie für gewöhnliche Objekte new
und delete
. Die Verwendung von delete[]
auf einem Nicht-Array könnte zu Verwüstungen führen.
Sie müssen delete [] verwenden, wenn Sie Speicherplatz mit dem Operator new [] zugewiesen haben (z. B. ein dynamisches Array).
Wenn Sie den Operator new verwendet haben, müssen Sie den Operator delete ohne die eckigen Klammern verwenden.
Es bezieht sich nicht auf das Löschen eines integrierten Typs oder einer benutzerdefinierten Klasse.
Wenn wir einen Speicher freigeben wollen, der einem Zeiger auf ein Objekt zugewiesen ist, wird "Löschen" verwendet.
int * p;
p=new int;
// now to free the memory
delete p;
Aber wenn wir Speicher für Array von Objekten wie zugewiesen haben
int * p= new int[10]; //pointer to an array of 10 integer
dann Speicherplatz freigeben, der 10 ganzen Zahlen entspricht:
delete []p;
HINWEIS: Sie können den Speicher auch mit delete p;
freigeben, aber nur den ersten Elementspeicher freigeben.
Wenn Sie Effektives C++ - Teil 1 haben , beziehen Sie sich auf Punkt 5: Verwenden Sie dasselbe Formular in entsprechender Verwendung von Neu und Löschen.
Und jetzt funktioniert es gut.
Mehr dieses Glück, wenn es das tut, und sind Sie sicher, dass es wirklich funktioniert?
Der Destruktor für jedes Objekt muss aufgerufen werden. Der delete[]
-Operator verwendet die von new[]
festgelegten Informationen, um zu bestimmen, wie viele Objekte zerstört werden sollen. Während delete
alleine den Speicher wiederherstellen kann (ob er von der Implementierung abhängig ist oder nicht), kann er jedoch den Destruktor nicht für jedes zugewiesene Objekt aufrufen.
Es ist möglich, dass die Informationen darüber, wie die Objekte zugewiesen wurden, beim Aufruf von new
oder new[]
eingeschlossen werden, sodass die richtige Löschart verwendet wird. Dies ist jedoch von der Implementierung abhängig und nicht garantiert.
In seinem Blog mit dem Titel Mismatching scalar und vector new und delete beschreibt Raymond Chen ausführlich, wie Scaler und Vector Delete funktionieren.
Hier ist ein Link zu dem in diesem Artikel falsch verknüpften InformIT-Artikel: http://www.informit.com/articles/article.aspx?p=30642
zusätzlich (natürlich sollte meine tippgeschwindigkeit verbessert werden :), erwäge nicht mit zeigern wenn du wirklich nicht musst. z.B. char*
kann durch std::string
ersetzt werden. Wenn Ihr vertexesset
-Member nicht polymorph ist, können Sie es zu einem Member-Objekt machen. In diesem Fall benötigen Sie delete
überhaupt nicht