我的一位朋友使用
宣布了一种新类型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维数组,那么如何从内存中正确删除?
提前谢谢;答案 0 :(得分:7)
1。二维数组可以作为一维数组,其中每个元素都是一个数组。
使用此定义,您可以看到new vec3_t[num_xyz* num_frames]
等效于二维数组。
2。此数组由num_xyz* num_frames
个成员组成,每个成员占用sizeof (vec3_t)
的空格
执行new
时,它会在堆中分配num_xyz* num_frames
个内存块,它会注意到这个数字,这样当调用delete[]
时,它会知道sizeof (vec3_t)
它有多少个块应该在堆中标记为空闲。
答案 1 :(得分: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;
答案 2 :(得分:2)
它将以与分配相同的方式删除 - 一段连续的内存。
答案 3 :(得分:2)
你几乎做对了,
vec3_t[num_xyz* num_frames]
相当于
GLfloat[num_xyz* num_frames][3]
由于您使用new[]
进行了分配,因此必须使用delete[]
进行删除。
答案 4 :(得分:1)
我认为删除是可以的,但为了减少混淆,我倾向于这样做:
struct vec3_t{
GLFloat elems[3];
};
vec3_t* vertices = new vec3_t[num_xyz* num_frames];
现在您可以看到vertices
的类型和:
delete [] vertices;
显然是正确的。