2010-03-21 18 views
24

Ich habe zugewiesen und Array von Objektendelete [] ein Array von Objekten

Objects *array = new Objects[N]; 

Wie soll ich dieses Array löschen? Gerade

delete[] array; 

oder mit Iterieren über die Elemente des Arrays?

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

Dank

UPDATE:

änderte ich Schleifenkörper als

delete &array[i]; 

den Code zu zwingen, zu kompilieren.

+0

wird dies Array von Zeigern oder Zeiger auf Array sein? – osgx

+1

ist es Zeiger auf Array. – Naveen

+4

Tuning this: 'Löschen & Array [i];' ist falsch. Sie haben new nicht verwendet, um das Elementarray [i] zuzuweisen, also sollten Sie es nicht löschen. Löschen Sie das gesamte Array. –

Antwort

38

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

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

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

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

Die Tatsache, dass Ihr Original-Code hat Ihnen einen Kompilierungsfehler ist ein starker Hinweis, dass Sie etwas falsch zu machen sind .

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

+0

Ich kann Vektor nicht verwenden. Es ist eine Hausaufgabe :) – osgx

+22

Nein! Verwenden Sie nicht std :: vector blind als Ersatz für Arrays! Das ist so, als würde ich sagen: "Ich habe einen Transportbedarf, also werde ich ein Auto benutzen." Manchmal ist es die richtige Antwort, aber manchmal muss man nebenan gehen, und manchmal muss man von Montreal nach Moskau fahren. In vielen Fällen, in denen ein Array nahe der richtigen Antwort ist, Sie aber eine Standardbibliothek wünschen, ist std :: valarray das, was Sie wollen. Und in vielen Fällen ist ein Array tatsächlich die richtige Antwort. –

+7

@Brooks. Ich kann mir eine Situation vorstellen, in der ein dynamisch zugewiesenes Array nicht effizient durch einen std :: vector ersetzt werden kann. Dies liegt daran, dass ein std :: vector __IS__ ein Array ist (der einzige Unterschied besteht darin, dass der Vektor die gesamte Speicherverwaltung handhabt). Wenn es sich um eine statisch zugewiesene Array-Feineinstellung handelt, können Sie mit der Verwendung eines Arrays eine kleine Leistungsverbesserung erzielen. –

6
delete [] array 

ist genug.

11

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.

13

Als allgemeine Regel sollten Sie delete/delete[] genau jene Dinge, die Sie mit new/new[] zugewiesen haben. In diesem Fall haben Sie eine Zuweisung mit new[], also sollten Sie einen Anruf an delete[] verwenden, um diese zugewiesene Sache wieder freizugeben.

Dass die delete s in der for-Schleife nicht kompiliert wird, ist auch ein guter Hinweis, dass sie nicht der richtige Weg sind, es zu tun.

7

ist nicht nur

delete [] array; 

genug, aber wenn man

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

tun werden Sie nicht definiertes Verhalten verursachen, weil

delete &array[i]; 

Dinge zu löschen wird, die ‚weren t durch eine new Operation zurückgegeben.

Nicht zu erwähnen, dass der nachfolgende delete[] array; den Destruktor für alle Objekte aufrufen wird, die gerade Destruktoren in der Schleife aufgerufen hatten.

Also tu das nicht.