Frage

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

War es hilfreich?

Lösung

Der delete Operator freigibt Speicher und ruft den Destruktor für ein einzelnes Objekt mit new erstellt.

Der delete [] Operator freigibt Speicher und ruft Destruktoren für eine Reihe von Objekten mit new [] erstellt.

Mit delete auf einem Zeiger von new [] oder delete [] auf einem Zeiger zurückgegeben durch new Ergebnisse in undefiniertem Verhalten zurückgegeben.

Andere Tipps

Der delete[] Operator wird verwendet Arrays zu löschen. Der delete Operator wird verwendet nicht-Array-Objekte zu löschen. Er fordert operator delete[] und operator delete Funktion jeweils um den Speicher zu löschen, die das Array oder ein Objekt nicht-Array besetzt nach (schließlich) Objekt der Destruktoren für die Array-Elemente oder das Nicht-Array-Aufruf.

Im Folgenden werden 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 eine new, die ein Array erzeugt (also entweder die new type[] oder new auf ein Array-Typ-Konstrukt angewendet), sieht der Standard für eine operator new[] in der Elementtypklasse des Arrays oder im globalen Bereich und gibt die Menge an Speicher, angefordert. Es kann mehr als N * sizeof(ElementType) verlangt, wenn sie will (zum Beispiel der Anzahl der Elemente zu speichern, so dass es später beim Löschen weiß, wie viele destructor Anrufe getan). Wenn die Klasse eine operator new[], die auf die Größe des Speichers zusätzliche erklärt eine andere size_t akzeptiert, dass der zweite Parameter die Anzahl der Elemente zugewiesen erhalten - kann es dies für jeden Zweck verwenden sie will (Debugging, etc ...).

Für ein new, die ein nicht-Array-Objekt erstellt, wird es sucht eine operator new in der Klasse des Elements oder im globalen Bereich. Es geht um die Menge an Speicher angefordert (genau sizeof(T) immer).

Für eine delete[] sieht es in der Elementklasse -Arrays Typ und ruft ihre Destruktoren. Die operator delete[] Funktion ist die in der Klasse des Elementtypen, oder wenn es keine dann im globalen Bereich.

Für ein 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 nicht eine Basisklasse ist, dann wird der Destruktor dieser Klasse genannt, und ein operator delete in dieser Klasse oder dem globalen operator delete verwendet. Wenn eine Basisklasse übergeben wurde, dann die tatsächliche destructor Objekttyp genannt wird, und die operator delete in dieser Klasse gefunden wird, oder wenn es keine gibt, ist ein globaler operator delete genannt. Wenn die operator delete in der Klasse einen zweiten Parameter des Typs size_t hat, wird es die Anzahl der Elemente ausplanen erhalten.

die grundlegende Verwendung dieser von zuteilen / DE-zuteilen Muster in c ++ malloc / free, neu / löschen, new [] / delete []

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

1) Löschen wird verwendet, Speicher, um de-Zuweisung zugewiesen für einzelnes Objekt

2) delete [] verwendet wird, um de-Speicher zuzuordnen zugeordnet für Array von Objekten

Klasse ABC {}

ABC * ptr = new ABC [100]

, wenn wir sagen, neue [100] .. Compiler können die Informationen darüber, wie viele Objekte erhalten, die zugeordnet werden muss (hier ist es 100) und den Konstruktor für jedes der Objekte erstellt

nennen

aber entsprechend, wenn wir einfach verwenden löschen ptr für diesen Fall, Compiler wird nicht wissen, wie viele Objekte, die ptr zeigt auf und wird am Ende Aufruf von destructor und Löschen Speicher für nur 1 Objekt (verlassen der Aufruf von Destruktoren und Aufhebung der Zuordnung von Objekten 99 verbleiben). Daher gibt es einen Speicherverlust

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

Die Betreiber delete und delete [] verwendet werden jeweils die Objekte mit new und new[] erstellt zu zerstören, an den zugewiesenen Speicher Rückkehr zur Verfügung links in den Speicher-Manager des Compilers.

Objekte mit new erstellt wird, müssen unbedingt mit delete zerstört werden, und dass die Arrays mit new[] erstellt wird, sollte mit delete[] gelöscht werden.

Als ich diese Frage gestellt, meine eigentliche Frage war, „gibt es einen Unterschied zwischen den beiden? Hat nicht die Laufzeit haben Informationen über die Array-Größe zu halten, und so wird es nicht in der Lage sein, zu sagen, welche wir meinen ?“ Diese Frage nicht in „verwandten Fragen“ angezeigt wird, so dass nur diejenigen, die wie mir zu helfen, hier ist die Antwort auf diese Frage: " warum brauchen wir auch den löschen Operator []? "

delete ist für einen einzigen Zeiger verwendet und delete[] wird zum Löschen eines Arrays über einen Zeiger verwendet. Diese könnte Ihnen helfen, besser zu verstehen.

Nun .. vielleicht denken, dass ich es nur für explizit ist. Der Betreiber löschen und Operator delete [] unterscheidet sich aber Operator löschen kann zu Array freigeben.

test* a = new test[100];
delete a;

Und bereits überprüft dieser Code keine memeory Leck.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top