Основной вопрос о памяти 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 массивами dimentional, Как это - supporsed, который будет правильно удален из памяти?

заранее спасибо;
от deo

12
задан Dr Deo 4 January 2010 в 08:40
поделиться

5 ответов

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

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

7
ответ дан 2 December 2019 в 20:40
поделиться

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
ответ дан 2 December 2019 в 20:40
поделиться

Вы почти правильно поняли,

vec3_t[num_xyz* num_frames]

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

GLfloat[num_xyz* num_frames][3]

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

2
ответ дан 2 December 2019 в 20:40
поделиться

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

См. 2D-разметка памяти массива

2
ответ дан 2 December 2019 в 20:40
поделиться

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

struct vec3_t{
  GLFloat elems[3];
};

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

Теперь вы можете видеть тип вершин - и:

delete [] vertices;

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

1
ответ дан 2 December 2019 в 20:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: