Подтвердить что ты не робот

Основной вопрос на С++

мой друг объявил новый тип, используя

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

4b9b3361

Ответ 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;

Ответ 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;

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