基本的C ++内存问题

时间:2010-01-04 08:40:44

标签: c++ opengl

我的一位朋友使用

宣布了一种新类型
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

5 个答案:

答案 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)

它将以与分配相同的方式删除 - 一段连续的内存。

请参阅2D array memory layout

答案 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;

显然是正确的。