如何在堆上分配 std::array ?

How do you allocate an std::array on the heap?

提问人:Ashdeep Singh 提问时间:2/12/2022 最后编辑:trincotAshdeep Singh 更新时间:2/12/2022 访问量:995

问:

在堆上分配 std::array 时遇到了一些麻烦。

这是我尝试过的:

std::array<int,3> *arr1; 
arr1 = new std::array<int,3>;
arr1[0] = 1;

但是,我得到的错误是:

错误:“operator*”不匹配(操作数类型为“std::array”)。

我也试过:

arr1[0][0] = 1;

这有效,但同样有效:

arr1[5][5] = 2;

这应该不起作用,因为 std::array<int, 3> 表示数组大小应该只有 3 个整数。

我在这里做错了什么?

C++ 数组动态 堆内存 标准

评论

5赞 Etienne de Martel 2/12/2022
(*arr1)[0] = 1;
0赞 Ashdeep Singh 2/12/2022
但如果我这样做,我仍然可以做到:(*arr1)[10] = 1;
3赞 Etienne de Martel 2/12/2022
嗯,是的,没有边界检查。这与动态分配无关。std::arrayoperator[]

答:

5赞 user17732522 2/12/2022 #1

访问数组的正确语法是 然后索引到其中,例如 .*arr1(*arr1)[1]

arr1[0][1]等同于此,但更难理解,任何更高的第一个索引都将是越界的,导致未定义的行为。

[]不进行任何边界检查,因此您不会收到任何警告或错误,例如。如果这样做,程序将具有未定义的行为,这意味着您将无法保证它的行为方式。(*arr1)[10]

如果希望在索引越界时引发异常,请使用 而不是 .arr1->at(10)(*arr1)[10]


与仅使用 堆相比,堆分配不太可能有显著的好处,但会给手动管理其生存期带来额外的麻烦。std::arraystd::vector

只需改用,它还将为堆上的元素分配内存:std::vector

std::vector<int> arr1(3);
arr1[0] = 1; // ok
arr1.at(10) = 1; // throws out-of-bounds exception