【发布时间】:2019-01-05 12:38:30
【问题描述】:
经过一些实验,我想出了这四种在堆上创建多维数组的方法(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
【问题讨论】:
-
我觉得第一个是UB,其他三个都可以。
-
@geza 嗯,是什么让你认为它是 UB?
-
嗯。为什么不直接使用
std::vector? -
@JesperJuhl 太容易了)))好吧,有些东西让我很好奇,而且这是一个很好的练习
-
一般情况下,您不应将引用用作任何内容的拥有副本。其他程序员希望引用是指存在于其他地方的东西,并且引用可以超出范围而不会出现问题。如果最后需要删除某些内容,则应使用
unique_ptr之类的内容,或者至少使用拥有指针而不是引用。
标签: c++ multidimensional-array c++14 language-lawyer heap-memory