2010-01-04 3 views
12

мой друг объявил новый тип с помощьюBasic C++ вопрос памяти

typedef GLfloat vec3_t[3]; 

и в дальнейшем используется vec3_t для выделения памяти

vertices=new vec3_t[num_xyz* num_frames]; 

Он освободил память, используя

delete [] vertices; 

Вопрос:
1. Так как vec3_t является псевдонимом для GLfloat [3], это значит, что

vec3_t[num_xyz* num_frames] 

эквивалентно

GLfloat[3][num_xyz* num_frames]; 

2. Если выше в 2 х мерном массиве, как следует ли его правильно удалить из памяти?

благодарит заранее;
от deo

ответ

7

1. двухмерный массив может быть thoght как одномерный массив, где каждый элемент является массивом.
, используя это определение, вы можете видеть, что new vec3_t[num_xyz* num_frames] эквивалентен двумерному массиву.

2. этот массив состоит из num_xyz* num_frames членов каждого принимает пространство sizeof (vec3_t)
когда new осуществляются выделяет num_xyz* num_frames памяти в парнях кучи, она принимает к сведению этого номера так, что при вызове delete[] он будет знаете, сколько блоков sizeof (vec3_t) оно должно пометить как свободное в куче.

2

Он будет удален так же, как он был выделен - один непрерывный фрагмент памяти.

См 2D array memory layout

+1

Это не совсем правильно, существует разница между распределением массива и распределением одного объекта. поэтому у вас есть удаление vs delete [] – Eli

+1

Визуализация в первом примере вашей ссылки вводит в заблуждение - ttt определяется как массив, а не как указатель. – hjhill

1

Я думаю, что удаление в порядке, но для уменьшения путаницы, я, как правило, сделать это:

struct vec3_t{ 
    GLFloat elems[3]; 
}; 

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

Теперь вы можете увидеть тип vertices и:

delete [] vertices; 

, очевидно, правильный.

2

Вы почти получили это право,

vec3_t[num_xyz* num_frames] 

эквивалентно

GLfloat[num_xyz* num_frames][3] 

Поскольку вы наделенный new[], вы должны удалить с delete[].

3

GLfloat - это массив, который «статически» выделен и, следовательно, не требуется явно освобождать его.

С точки зрения памяти зрения, это typedef эквивалентно следующей структуре:

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

Вы можете иметь следующий код, который теперь менее запутанным:

vec3_t* vertices = new vec3_t [num_xyz* num_frames]; 
[...] 
delete[] vertices; 
Смежные вопросы