指向固定大小数组的指针数组的内存分配说明

时间:2013-06-17 02:47:17

标签: c++

我有一个我写过的程序,要求我声明一个数组

float (*array)[3] = new float[faces * 3][3];

现在我理解了语法和所有,这是一个指向固定大小数组的指针数组。我不明白的是这背后的潜在组织。由于只有一个内存分配(对于指针数组),固定大小数组的内存如何分配?

沿着同一个线程,因为只有一个分配,所以应该有一个删除,这意味着该数组将被删除

delete[] array;

但我对如何获取所有内存感到困惑,因为它似乎只删除了指针数组,而不是它们指向的内存。

2 个答案:

答案 0 :(得分:1)

这不是指向固定大小数组的指针数组。这是一个指向多维数组的指针。多维数组实现为一维数组,在访问元素时进行一些计算。

内存布局与此声明完全相同:

float *array = new float[(faces * 3) * 3];

或者在这一个(faces除外必须是常量表达式,并且分配现在在堆栈上):

float arr3[faces*3][3];
float (*array)[3] = &arr3; // note the "&". it is not a decaying here

这是一个更熟悉的指针形式:

void something(float array[][3]); // this is not an array, but a pointer to one.

请注意,不同大小/维度的数组是不同的类型,如果要将多维数组作为多维数组访问,现在需要自己计算array[3][2]

答案 1 :(得分:0)

宝贝步骤。

首先,这些float[3]的固定长度数组看起来像特殊类型。我猜你会和他们一起做特定的操作。您应该将float[3]包含将与它们一起使用的函数和操作包装到类中。您可以决定在内部使用Vector<float>并将其保留在尺寸3 ,但std::vector设计为附加和删除。我认为还有另一个“std模板”类是为固定长度的倍数设计的,但我不知道哪个。我不太使用 STL

一旦你对你的float[3]进行客体化,无论你做了什么,我认为当你开始看得更清楚时,其余部分会变得更容易。