2013-02-23 18 views
5

In semplice array 1D:Come faccio a cancellare questo array 2D in C++

node *nodes = new node[MAX_NODES]; 

Cancellazione da:

delete [] nodes; 

Elimina tutti i nodi allocati nella matrice.

Ma in questo caso:

float (*buildingArray)[3] = new float[10][3]; 

questa dichiarazione rende buildingArray un array monodimensionale di puntatori 3 galleggiante? E questa è la linea deallocazione:

delete[] buildingArray; 

fa il sopra deallocazione delete la matrice, ma sono dubbioso sul fatto che cancellerà i suoi riferimenti?

+0

Usa i vettori invece - http://www.cplusplus.com/reference/vector/vector - Molto più semplice. –

+5

A volte una base di codice esistente ci obbliga a utilizzare array bidimensionali. Se potessi fare un downvoting dei commenti .... – codetaku

risposta

15

La suddetta de-assegnazione cancella l'array?

Sì, sì.

Basta seguire la regola:

È necessario chiamare delete o delete [] tutte le volte che si chiamati rispettivamente new o new [].


Se tu avessi un array di puntatori, dove ciascun indice è stato allocato memoria dinamica, si avrebbe bisogno di esplicitamente ciclo attraverso di essa e deallocare ogni elemento dell'array in modo esplicito.


Su un lato nota si è molto meglio utilizzando una matrice std::vector o std::array anziché allocati dinamicamente.

+0

ok ecco perché ogni elemento non ha memoria dinamica, solo 1 dimensione (righe) ha memoria dinamica e le 3 colonne hanno memoria statica, quindi non c'è bisogno di de-allocarle. Ho ragione ? – Anubha

+0

@Anubha: L'istruzione 'float (* buildingArray) [3] = new float [10] [3];' assegna abbastanza memoria dinamica per l'archiviazione di una matrice di 10 matrici di 3 float. L'intera memoria è su freestore (aka heap). Ma dato che è stato assegnato usando una singola chiamata a 'new []', una singola chiamata a 'delete [] 'si adatta perfettamente. –

+0

ok, quindi in questa domanda http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new, l'initailizzazione dell'array utilizzava 2 nuove dichiarazioni, quindi semplice cancellazione [] ary; non avrebbe funzionato in quel caso? – Anubha

2

new float[10][3] alloca una matrice di 10 matrici di 3 floats e restituisce un puntatore al primo elemento (che è una matrice di 3 float).

La chiamata a delete[] su questo puntatore provoca la cancellazione dell'intero array.

L'unica differenza tra i due casi è che nel primo caso il tipo di valori memorizzati nell'array assegnato dinamicamente è float e nel secondo caso il tipo è float[3].

3

Sì, sì. La spiegazione è perché non ci sono informazioni in memoria su quante dimensioni ha il tuo array.

Se si dispone di un array di elementi 3 * 4, è esattamente lo stesso di un array di 12 elementi. È proprio il modo in cui si indirizzano gli elementi specifici (che sono memorizzati in modo riga dopo riga) che cambia.

Quindi delete[] funzionerà perfettamente.

Ma utilizzare gli operatori new e delete non è così comune in questi giorni con smart pointers, a meno che non si abbia davvero una buona ragione per controllare l'allocazione.