Frage

Ich habe Objekte zugeteilt und Array von Objekten

Objects *array = new Objects[N];

Wie soll ich dieses Array löschen? Gerade

delete[] array;

Oder mit der Iteration über die Elemente des Arrays?

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

Vielen Dank

AKTUALISIEREN:

Ich habe den Schleifenkörper verändert als

delete &array[i];

den Code zum Kompilieren erzwingen.

War es hilfreich?

Lösung

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

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

Dies wäre nur angemessen, wenn Sie das Array als:

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

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

Übrigens, obligatorisch: Vermeiden Sie es, Arrays mit zuzuweisen new[]; verwenden std::vector Stattdessen kümmert sich sein Destruktor um die Reinigung für Sie. Zusätzlich wird es ausnahmslos sicher sein, indem er nicht den Speicher ausgeht, wenn Ausnahmen ausgewiesen werden.

Andere Tipps

Gerade delete[] array ist ausreichend. Es ist garantiert, dass jedes Element des Arrays beim Löschen eines Arrays gelöscht wird delete[] Operator.

In der Regel sollten Sie delete/delete[] Genau die Dinge, mit denen Sie zugewiesen haben new/new[]. In diesem Fall haben Sie eine Zuweisung mit new[], Sie sollten also einen Anruf verwenden delete[] Um dieses zugewiesene Ding wieder zu befreien.

Dass die deleteS in der für die Schlaufe nicht kompilierten Schleife ist auch ein guter Hinweis darauf, dass sie nicht der richtige Weg sind, dies zu tun.

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];

Wird Dinge löschen, die nicht von a zurückgegeben wurden new Betrieb.

Ganz zu schweigen davon, dass nachfolgend delete[] array; Ich werde den Destruktor für alle Objekte nennen, die gerade Destruktoren in der Schleife gerufen hatten.

Also mach das nicht.

delete [] array

reicht.

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