Основной вопрос на С++
мой друг объявил новый тип, используя
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
Ответы
Ответ 1
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
GLfloat
- это массив, который "статически" распределяется и, следовательно, не требуется явно освобождать его.
С точки зрения памяти это typedef
эквивалентно следующей структуре:
typedef struct {
GLfloat f1;
GLfloat f2;
GLfloat f3;
} vec3_t;
Затем вы можете иметь следующий код, который теперь менее запутанным:
vec3_t* vertices = new vec3_t [num_xyz* num_frames];
[...]
delete[] vertices;
Ответ 3
Он будет удален так же, как он был выделен - одна непрерывная часть памяти.
См. Макет памяти 2D-массива
Ответ 4
Ты почти правильно понял,
vec3_t[num_xyz* num_frames]
эквивалентно
GLfloat[num_xyz* num_frames][3]
Поскольку вы выделили new[]
, вам нужно удалить с помощью delete[]
.
Ответ 5
Я думаю, что удаление в порядке, но для уменьшения путаницы я обычно делаю это:
struct vec3_t{
GLFloat elems[3];
};
vec3_t* vertices = new vec3_t[num_xyz* num_frames];
Теперь вы можете увидеть тип vertices
и:
delete [] vertices;
очевидно, правильно.