在堆上创建多维数组
Creating multidimensional array on the heap
经过一些实验,我想出了这四种在堆上创建多维数组的方法(1 和 2 有点相同,除了 1 的结果我想参考):
#include <memory>
#include <iostream>
template <typename T>
void printArr(T const &arr)
{
std::cout << typeid(T).name() << "t";
for (int x = 0; x < 2; ++x)
for (int y = 0; y < 2; ++y)
for (int z = 0; z < 2; ++z)
std::cout << arr[x][y][z] << " ";
std::cout << std::endl;
}
int main()
{
int(&arr)[2][2][2] = reinterpret_cast<int(&)[2][2][2]>(*new int[2][2][2]{ { { 1,2 },{ 3,4 } }, { { 5,6 },{ 7,8 } } });
printArr(arr);
delete[] &arr;
int(*arr2)[2][2] = new int[2][2][2]{ { { 1,2 },{ 3,4 } },{ { 5,6 },{ 7,8 } } };
printArr(arr2);
delete[] arr2;
std::unique_ptr<int[][2][2]> arr3(new int[2][2][2]{ { { 1,2 },{ 3,4 } },{ { 5,6 },{ 7,8 } } });
printArr(arr3);
std::unique_ptr<int[][2][2]> arr4 = std::make_unique<int[][2][2]>(2);
printArr(arr4);
return 0;
}
在各种在线编译器上对此进行了测试,没有问题,那么我想知道它们是否也是有效的方法?
下面是演示 https://ideone.com/UWXOoW 和输出:
int [2][2][2] 1 2 3 4 5 6 7 8
int (*)[2][2] 1 2 3 4 5 6 7 8
class std::unique_ptr<int [0][2][2],struct std::default_delete<int [0][2][2]> > 1 2 3 4 5 6 7 8
class std::unique_ptr<int [0][2][2],struct std::default_delete<int [0][2][2]> > 0 0 0 0 0 0 0 0
我认为您的第一个示例是未定义的行为,或者至少在您尝试通过引用arr
实际访问数组时会导致未定义的行为。
new int[2][2][2]
创建一个包含两个int[2][2]
的数组。它返回指向此数组的第一个元素的指针 ([expr.new] §1)。但是,指向数组第一个元素的指针和指向数组本身的指针不是指针可相互转换的。我不确定对于哲学问题"取消引用无效指针的行为本身是否已经构成未定义的行为?"是否有明确的答案。但至少访问从reinterpret_cast获得的引用绝对应该违反严格的混叠规则。其他三个应该没问题。
编辑:
由于似乎仍然存在一些混乱,这里对我的论点进行更详细的解释:
new int[2][2][2]
创建一个包含两个int[2][2]
的数组,并返回指向该数组的第一个元素的指针,即指向此数组中第一个int[2][2]
子对象的指针,而不是完整的数组对象本身。
如果你想从new
那里得到一个int(*)[2][2][2]
,你可以,例如,
new int[1][2][2][2]
相关文章:
- 在c++中为double类型的数组创建一个unique_ptr
- 如何从预定义的数组创建某些元素数组
- 基于数组的列表 - 动态数组创建时出错
- 从 UTF-8 字节数组创建字符串?
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- C++ 从名称数组创建对象
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 从 std::数组创建十六进制代表
- 在 C++ 结构内声明的数组 A[1] 创建多个实例
- 为多维数组创建内存空间
- 如何使用任何类型的数组创建模板类并为其设置值?
- 从字符串数组创建一个字符数组
- 是否可以在不为该数组创建变量的情况下将数组作为参数传递到函数中?
- 使用类定义数组创建C++类
- 使用具有唯一随机数的结构数组创建多个对象
- 谷歌测试:无法从字符数组创建字符串
- 从 1D 数组创建 2D 数组
- 无法通过一个单向链表数组创建邻接列表
- 如何使用数组创建标准::函数
- 在C++中,返回从本地字符数组创建的字符串是否会导致内存泄漏或未定义的行为