2010-03-21 23 views
24

ho assegnato e la matrice di oggettidelete [] un array di oggetti

Objects *array = new Objects[N]; 

Come dovrei cancellare questo array? Basta

delete[] array; 

o con l'iterazione sugli elementi della matrice?

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

Grazie

UPDATE:

ho cambiato corpo del ciclo come

delete &array[i]; 

di forzare il codice per compilare.

+0

questo sarà un array di puntatori o puntatore a matrice? – osgx

+1

è puntatore all'array. – Naveen

+4

In questo modo: "delete & array [i];" non è corretto. Non hai usato nuovo per allocare l'array di elementi [i], quindi non dovresti eliminarlo. Elimina l'intero array. –

risposta

38

Ogni utilizzo di new deve essere bilanciato da un delete e ogni utilizzo di new[] deve essere bilanciato da delete[].

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

che sarebbe opportuno solo se si inizializzato l'array come:

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

Il fatto che il codice originale ti ha dato un errore di compilazione è un suggerimento forte che si sta facendo qualcosa di sbagliato .

BTW, obbligatorio: evitare l'assegnazione di array con new[]; utilizzare invece std::vector, quindi il distruttore si prenderà cura della pulizia. Inoltre, sarà sicuro per le eccezioni non colando la memoria se vengono lanciate eccezioni.

+0

Non riesco a usare il vettore. È un compito :) – osgx

+22

No! Non usare std :: vector ciecamente come sostituto per gli array! È come dire "Ho bisogno di mezzi di trasporto, quindi userò una macchina". A volte è la risposta giusta, ma a volte devi andare alla porta accanto, ea volte devi andare da Montreal a Mosca. In molti casi in cui un array è vicino alla risposta giusta ma si desidera una libreria standard, std :: valarray è ciò che si desidera. E in molti casi un array è, infatti, la risposta giusta. –

+7

@Brooks. Posso pensare a qualsiasi situazione in cui una matrice allocata dinamicamente non può essere sostituita in modo efficiente con un vettore std ::. Questo perché un vettore std :: vector __IS__ un array (l'unica differenza è che il vettore gestisce tutta la gestione della memoria). Se si tratta di una matrice di array assegnata staticamente, è possibile ottenere un piccolo miglioramento delle prestazioni utilizzando solo un array. –

6
delete [] array 

è sufficiente.

11

Solo delete[] array è sufficiente. È garantito che ogni elemento dell'array viene eliminato quando si elimina un array utilizzando l'operatore delete[].

13

Come regola generale è necessario delete/delete[] esattamente ciò che è stato assegnato con new/new[]. In questo caso si dispone di un'allocazione con new[], quindi è necessario utilizzare una chiamata a delete[] per liberare di nuovo quella cosa allocata.

Che il s nel ciclo non si compili è anche una buona indicazione che non sono il modo giusto per farlo.

7

Non solo è

delete [] array; 

abbastanza, ma se lo fai

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

Potrai essere la causa un comportamento indefinito, perché

delete &array[i]; 

saranno cancellando le cose che weren' t restituito da un'operazione new.

Per non parlare del fatto che il successivo delete[] array; chiamerà il distruttore per tutti gli oggetti che hanno appena chiamato i distruttori nel ciclo.

Quindi non farlo.

Problemi correlati