2010-01-04 16 views
12

un mio amico ha dichiarato un nuovo tipo utilizzandobase C++ domanda memoria

typedef GLfloat vec3_t[3]; 

e vec3_t in seguito utilizzato per allocare la memoria

vertices=new vec3_t[num_xyz* num_frames]; 

Liberò la memoria utilizzando

delete [] vertices; 

Domanda:
1. Da vec3_t è un alias per [3] GLfloat, significa che

vec3_t[num_xyz* num_frames] 

è equivalente a

GLfloat[3][num_xyz* num_frames]; 

2. Se quanto precede è una matrice tridimensionale 2, Come è soppresso per essere correttamente cancellato dalla memoria?

grazie in anticipo;
da deo

risposta

7

1. un array bidimensionale può essere utilizzato come un array monodimensionale in cui ogni elemento è un array.
utilizzando questa definizione si può vedere che new vec3_t[num_xyz* num_frames] è equivalente a una matrice bidimensionale.

2. questa matrice è fatta di num_xyz* num_frames membri ciascuno prendendo uno spazio di sizeof (vec3_t)
quando new viene effettuata alloca num_xyz* num_frames scrupolosi memoria nell'heap, prende nota di questo numero in modo che quando si chiama delete[] lo farà sapere quanti blocchi di sizeof (vec3_t) dovrebbe essere contrassegnato come libero nell'heap.

2

Sarà cancellato nello stesso modo in cui è stato assegnato, un pezzo di memoria contigua.

Vedi 2D array memory layout

+1

questo non è del tutto corretto, c'è una differenza tra l'assegnazione di un array e l'assegnazione di un singolo oggetto. ecco perché hai delete vs delete [] – Eli

+1

La visualizzazione nel primo esempio del tuo link è fuorviante - ttt è definito come un array, non come un puntatore. – hjhill

1

Penso che la cancellazione è OK, ma per ridurre la confusione tendo a fare questo:

struct vec3_t{ 
    GLFloat elems[3]; 
}; 

vec3_t* vertices = new vec3_t[num_xyz* num_frames]; 

Ora è possibile vedere il tipo di vertices e:

delete [] vertices; 

è ovviamente corretto.

2

È quasi capito bene,

vec3_t[num_xyz* num_frames] 

equivale a

GLfloat[num_xyz* num_frames][3] 

Dal momento che avete assegnato con new[], è necessario eliminare con delete[].

3

GLfloat è un array che è "statisticamente" allocato e che quindi non ha bisogno di essere esplicitamente deallocato.

Da un punto in memoria di vista, questo typedef è equivalente alla seguente struttura:

typedef struct { 
    GLfloat f1; 
    GLfloat f2; 
    GLfloat f3; 
} vec3_t; 

È possibile quindi il seguente codice che è ora meno confusione:

vec3_t* vertices = new vec3_t [num_xyz* num_frames]; 
[...] 
delete[] vertices;