对指向固定大小数组的指针数组的内存分配的解释
Explanation of memory allocation for array of pointers to fixed size arrays
我写了一个程序,要求我声明一个数组
float (*array)[3] = new float[faces * 3][3];
现在我明白语法了,这是一个指向固定大小数组的指针数组。我不明白的是这背后的组织。由于只有一个内存分配(指针数组)如何为固定大小的数组分配内存?
在同一个线程中,因为只有一次分配,所以应该有一次删除,这意味着数组被 删除。delete[] array;
,但我很困惑,这是如何得到所有的内存,鉴于似乎只有指针数组已被删除,而不是他们指向的内存。
这不是一个指向固定大小数组的指针数组。这是一个指向多维数组的指针。多维数组被实现为一维数组,在访问元素时需要进行一些计算。
内存布局与下面的语句完全相同:
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]
的计算。
步步高升
首先,这些固定长度的float[3]
数组看起来像是特殊类型。我猜你会和他们一起做一些特殊的手术。您应该将float[3]
与将与它们一起工作的函数和操作包装到一个类中。您可以决定在内部使用Vector<float>
,并将它们的大小保持在 3,但是std::vector
被设计为可以添加和删除。我认为还有另一个"std模板"类是为固定长度的倍数设计的,但我不知道是哪个。我不怎么用STL
一旦你客观化了你的float[3]
,不管你怎么做,我认为剩下的会变得更容易,因为你开始看得更清楚。
相关文章:
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”