wake-up-neo.net

Der Unterschied zwischen delete und delete [] in C++

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?

32
SIMEL

Sie delete [], wenn Sie einen Array-Typ neweden, 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 [].
58
etarion

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.

14
EmeryBerger
  • Wenn Sie mit malloc () zuordnen, verwenden Sie free ().
  • Wenn Sie mit neu zuordnen, verwenden Sie löschen
  • Wenn Sie mit new [] zuordnen, verwenden Sie delete [].
  • Wenn Sie mit placement-new konstruieren, rufen Sie den Destruktor direkt auf
  • Wenn es sinnvoll ist, Vektor anstelle von new [] zu verwenden, verwenden Sie ihn
  • Wenn es sinnvoll ist, intelligente Zeiger zu verwenden, verwenden Sie sie und machen Sie sich nicht die Mühe, delete zu rufen (aber Sie müssen immer noch new aufrufen). Die übereinstimmende Löschung befindet sich im Smart-Pointer.

https://isocpp.org/wiki/faq/freestore-mgmt

7
CashCow

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.

5
Francesco

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.

4
Dorababu Meka

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.

1
yasouser

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.

0
Clifford

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

0
Tergiver

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

0
davka