wake-up-neo.com

lösche [] ein Array von Objekten

Ich habe und Reihe Gegenstände zugeteilt

Objects *array = new Objects[N];

Wie soll ich dieses Array löschen? Gerade

delete[] array;

oder mit Iteration über die Elemente des Arrays?

for(int i=0;i<N;i++)
    delete array[i];
delete[];

Vielen Dank

AKTUALISIEREN:

Ich habe den Loop-Body als geändert

delete &array[i];

um den Code zum Kompilieren zu zwingen.

31
osgx

Jede Verwendung von new sollte durch ein delete ausgeglichen werden, und jede Verwendung von new[] sollte ausgeglichen werden durch delete[].

for(int i=0;i<N;i++)
    delete array[i];
delete[] array;

Das wäre nur angebracht, wenn Sie das Array wie folgt initialisieren:

Objects **array = new Objects*[N];
for (int i = 0; i < N; i++) { 
    array[i] = new Object;
}

Die Tatsache, dass Ihr ursprünglicher Code Ihnen einen Kompilierungsfehler gab, ist ein starker Hinweis darauf, dass Sie etwas falsch machen.

BTW, obligatorisch: Vermeiden Sie die Zuweisung von Arrays mit new[]; verwenden std::vector stattdessen und dann kümmert sich sein Destruktor um die Bereinigung für Sie. Außerdem ist es ausnahmesicher, indem kein Speicher verloren geht, wenn Ausnahmen ausgelöst werden.

43
jamesdlin

Nur delete[] array Ist ausreichend. Es ist garantiert, dass jedes Element des Arrays gelöscht wird, wenn Sie ein Array mit dem Operator delete[] Löschen.

14
Naveen

In der Regel sollten Sie genau die Dinge delete/delete[], Die Sie mit new/new[] Zugewiesen haben. In diesem Fall haben Sie eine Zuweisung mit new[], Daher sollten Sie einen Aufruf mit delete[] Verwenden, um die zugewiesene Sache wieder freizugeben.

Dass die deletes in der for-Schleife nicht kompiliert werden, ist auch ein gutes Indiz dafür, dass dies nicht der richtige Weg ist.

13
sth

Ist nicht nur

delete [] array;

genug, aber wenn du es tust

for(int i=0;i<N;i++)
    delete &array[i];
delete[] array;

sie werden undefiniertes Verhalten verursachen, weil

delete &array[i];

löscht Dinge, die nicht von einer new Operation zurückgegeben wurden.

Ganz zu schweigen davon, dass die folgenden delete[] array; ruft den Destruktor für alle Objekte auf, deren Destruktoren gerade in der Schleife aufgerufen wurden.

Also mach das nicht.

8
Michael Burr
delete [] array

reicht.

7
vava