2010-11-16 5 views
25

Ho questo nel mio codice:Eliminare un puntatore a puntatore (come array di array)

double** desc = new double* [size_out]; 
for (int i = 0; i < size_out; i++) 
    desc[i] = new double [size_in]; 

Come faccio a cancellare questo desc?

Devo fare:

delete [] desc; 

o

for (int i=0; i<size_out; i++) 
    delete [] desc[i]; 
delete [] desc; 

o

for (int i=0; i<size_out; i++) 
    delete [] desc[i]; 
delete desc; 

?

+0

Date un'occhiata qui: http://stackoverflow.com/questions/340943/c-multi-dimensional-arrays-on-the-heap –

risposta

16

semplici regole da seguire:

  • per ogni assegnazione, ci deve essere un deallocazione (EX1 è quindi sbagliato)
  • ciò che è stato allocato utilizzando new dovrebbero essere liberati utilizzando delete, utilizzando new[] dovrebbe essere deallocato utilizzando delete[] e utilizzando malloc dovrebbe essere deallocato mediante free (EX3 è quindi sbagliato)

Conclusione, EX2 è OK.

18

La cancellazione dovrebbe rispecchiare l'allocazione.

Da utilizzato new [] per allocare la matrice esterna e new [] (in un ciclo) per allocare le matrici interne, fanno anche per l'eliminazione. Cioè: la tua seconda soluzione è corretta; delete [] anche gli array interni in un ciclo e infine l'array esterno tramite delete [].

Detto, un (molto, molto) migliore soluzione in C++ sarebbe quella di utilizzare un nidificata std::vector:

// Declaration and initialization: 
vector<vector<double> > desc(size_out, vector<double>(size_in)); 

// No deletion! 
+1

+1 per la soluzione di vettore. –

+0

Grazie, ma sfortunatamente ho bisogno di usare questo doppio ** – yelo3

4

farei

for (int i=0; i<size_out; i++) 
    delete [] desc[i]; 
delete [] desc; 

per ogni array allocato con new [], si dispone di un corrispondente delete [].

Modifica: e come dice Rupdolph: smettere di utilizzare i matrici C e iniziare a utilizzare std::vector. Avrai (intendo cento volte!) Meno bug.

5

Soluzione 2 è quella giusta: ogni cella punta a una matrice allocata dinamicamente che deve essere eliminata utilizzando delete[]. Infine, l'array desc deve essere eliminato utilizzando delete[].

Soluzione bonus 4: evitare l'uso di array e passare a std::vector<std::vector<double> >.

17

Il tuo codice non dovrebbe essere compilato.Il tipo di una nuova espressione di matrice è un puntatore al tipo di elemento di matrice creato (il valore è un puntatore al primo elemento dell'array allocato).

Quindi il tipo di new double**[size_out] è double ***.

Ogni volta che si utilizza il modulo matrice di nuovo, è necessario utilizzare il modulo matrice di eliminazione anche se si assegna solo un array di dimensione uno.

double*** desc = new double**[size_out]; 
for (int i=0; i<size_out; i++) 
    desc[i] = new double*[size_in]; 


for (int i=0; i<size_out; i++) 
    delete[] desc[i]; 

delete[] desc; 

Si noti che non avete ancora assegnato alcuna double, puntatori solo.

Volevi davvero questo?

double** desc = new double*[size_out]; 
for (int i=0; i<size_out; i++) 
    desc[i] = new double[size_in]; 

for (int i=0; i<size_out; i++) 
    delete[] desc[i]; 

delete[] desc; 
+0

+1 per indicare il problema di mancata corrispondenza del tipo –