0

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

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

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

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

delete[] array;

但我很困惑这是如何获取所有内存的,因为似乎只有指针数组被删除,而不是他们指向的内存。

4

2 回答 2

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]

于 2013-06-17T02:52:57.240 回答
0

婴儿步。

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

一旦你客观化了你float[3]的,不管你怎么做,我认为随着你开始看得更清楚,剩下的会变得更容易。

于 2013-06-17T03:07:48.053 回答