2010-01-04 8 views
12

un de mes amis a déclaré un nouveau type en utilisantquestion de la mémoire de base C

typedef GLfloat vec3_t[3]; 

et plus tard utilisé vec3_t pour allouer de la mémoire

vertices=new vec3_t[num_xyz* num_frames]; 

Il a libéré la mémoire en utilisant

delete [] vertices; 

question:
1. Depuis vec3_t est un alias pour GLfloat [3], cela signifie que

vec3_t[num_xyz* num_frames] 

est équivalent à

GLfloat[3][num_xyz* num_frames]; 

2. Si ce qui précède est un tableau à 2 dimentionnelle, Comment Est-ce qu'il est supposé être correctement supprimé de la mémoire?

grâce à l'avance;
from deo

Répondre

7

1. un tableau bidimensionnel peut être considéré comme un tableau unidimensionnel où chaque élément est un tableau.
utilisant cette définition, vous pouvez voir que new vec3_t[num_xyz* num_frames] est équivalent à un tableau à deux dimensions.

2. ce tableau est fait de num_xyz* num_frames membres chacun prenant un espace de sizeof (vec3_t)
lorsque new est effectué, il alloue num_xyz* num_frames types louches de mémoire dans le tas, il prend note de ce numéro afin que lors de l'appel delete[] il sera savoir combien de blocs de sizeof (vec3_t) il devrait marquer comme libre dans le tas.

2

Il sera effacé de la même manière qu'il a été alloué - un morceau de mémoire contigu.

Voir 2D array memory layout

+1

cela n'est pas entièrement correct, il existe une différence entre l'allocation d'un tableau et l'allocation d'un seul objet. C'est pourquoi vous avez supprimer ou supprimer [] – Eli

+1

La visualisation dans le premier exemple de votre lien est trompeuse - ttt est défini comme un tableau, pas comme un pointeur. – hjhill

1

Je pense que la suppression est OK, mais pour éviter toute confusion, je tends à faire:

struct vec3_t{ 
    GLFloat elems[3]; 
}; 

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

Maintenant vous pouvez voir le type de vertices et:

delete [] vertices; 

est évidemment correct.

2

Vous l'avez presque droite,

vec3_t[num_xyz* num_frames] 

équivaut à

GLfloat[num_xyz* num_frames][3] 

Puisque vous avec new[] alloué, vous devez supprimer avec delete[].

3

GLfloat est un tableau qui est « statique » allouée et donc qui n'a pas besoin d'être explicitement désallouée.

D'un point de vue de la mémoire, ce typedef est équivalente à la structure suivante:

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

Vous pouvez alors le code suivant qui est maintenant moins confus:

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