мой друг объявил новое использование типа
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 массивами dimentional, Как это - supporsed, который будет правильно удален из памяти?
заранее спасибо;
от deo
1. двухмерный массив можно рассматривать как одномерный массив, где каждый элемент является массивом.
.
Используя это определение, можно увидеть, что new vec3_t[num_xyz* num_frame]
эквивалентен двухмерному массиву.
2. этот массив состоит из членов num_xyz* num_frame
, каждый из которых занимает пространство размера (vec3_t)
, когда выполняется new
, он выделяет num_xyz* num_frame
парней памяти в кучу, он записывает это число так, что при вызове delete[]
он будет знать, сколько блоков sizeof (vec3_t)
он должен пометить как свободные в куче.
GLfloat
- это массив, который "статически" выделен и, таким образом, не нуждается в явном разборе.
С точки зрения памяти, этот typedef
эквивалентен следующей структуре:
typedef struct {
GLfloat f1;
GLfloat f2;
GLfloat f3;
} vec3_t;
Тогда можно получить следующий код, который теперь менее запутан:
vec3_t* vertices = new vec3_t [num_xyz* num_frames];
[...]
delete[] vertices;
Вы почти правильно поняли,
vec3_t[num_xyz* num_frames]
эквивалентно
GLfloat[num_xyz* num_frames][3]
Поскольку вы выделили new[]
, вы должны удалить с помощью delete[]
.
Она будет удалена точно так же, как и была выделена - один сплошной фрагмент памяти.
Я думаю, что удаление - нормально, но чтобы уменьшить путаницу, я склонен делать это:
struct vec3_t{
GLFloat elems[3];
};
vec3_t* vertices = new vec3_t[num_xyz* num_frames];
Теперь вы можете видеть тип вершин -
и:
delete [] vertices;
- очевидно, правильно.