我有一个我写过的程序,要求我声明一个数组
float (*array)[3] = new float[faces * 3][3];
现在我理解了语法和所有,这是一个指向固定大小数组的指针数组。我不明白的是这背后的潜在组织。由于只有一个内存分配(对于指针数组),固定大小数组的内存如何分配?
沿着同一个线程,因为只有一个分配,所以应该有一个删除,这意味着该数组将被删除
delete[] array;
但我对如何获取所有内存感到困惑,因为它似乎只删除了指针数组,而不是它们指向的内存。
答案 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]
进行客体化,无论你做了什么,我认为当你开始看得更清楚时,其余部分会变得更容易。