2010-01-04 18 views
12

un amigo mío declaró un nuevo tipo usandoBásica C++ pregunta memoria

typedef GLfloat vec3_t[3]; 

y vec3_t utilizado más adelante para asignar memoria

vertices=new vec3_t[num_xyz* num_frames]; 

Se liberó la memoria utilizando

delete [] vertices; 

Pregunta:
1. Desde vec3_t es un alias para GLfloat [3], significa que

vec3_t[num_xyz* num_frames] 

es equivalente a

GLfloat[3][num_xyz* num_frames]; 

2. Si lo anterior es una matriz dimentional 2, ¿Cómo ¿Se admite que se borre correctamente de la memoria?

gracias de antemano;
desde deo

Respuesta

7

1. una matriz bidimensional se puede configurar como una matriz unidimensional donde cada elemento es una matriz.
usando esta definición, puede ver que new vec3_t[num_xyz* num_frames] es equivalente a una matriz bidimensional.

2. esta matriz está hecha de num_xyz* num_frames miembros cada uno teniendo un espacio de sizeof (vec3_t)
cuando new se lleva a cabo asigna num_xyz* num_frames tíos de memoria en el montón, se toma nota de este número para que al llamar delete[] lo hará saber cuántos bloques de sizeof (vec3_t) debe marcar como libres en el montón.

2

Se eliminará de la misma manera que se ha asignado - una pieza contigua de memoria.

Ver 2D array memory layout

+1

esto no es del todo correcto, existe una diferencia entre asignar una matriz y asignar un solo objeto. es por eso que tiene eliminar frente a eliminar [] – Eli

+1

La visualización en el primer ejemplo de su enlace es engañosa: ttt se define como una matriz, no como un puntero. – hjhill

1

Creo que el borrado está bien, pero para reducir la confusión que tienden a hacer esto:

struct vec3_t{ 
    GLFloat elems[3]; 
}; 

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

Ahora se puede ver el tipo de vertices y:

delete [] vertices; 

es obviamente correcto.

2

Casi se ha hecho bien,

vec3_t[num_xyz* num_frames] 

es equivalente a

GLfloat[num_xyz* num_frames][3] 

Ya que tienen atribuciones con new[], hay que eliminar con delete[].

3

GLfloat es una matriz asignada "estáticamente" y, por lo tanto, no es necesario desasignarla explícitamente.

Desde el punto de vista de la memoria, esta typedef es equivalente a la siguiente estructura:

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

, entonces puede tener el siguiente código que ahora es menos confuso:

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