提问人:Ashdeep Singh 提问时间:2/12/2022 最后编辑:trincotAshdeep Singh 更新时间:2/12/2022 访问量:995
如何在堆上分配 std::array ?
How do you allocate an std::array on the heap?
问:
在堆上分配 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 个整数。
我在这里做错了什么?
答:
5赞
user17732522
2/12/2022
#1
访问数组的正确语法是 然后索引到其中,例如 .*arr1
(*arr1)[1]
arr1[0][1]
等同于此,但更难理解,任何更高的第一个索引都将是越界的,导致未定义的行为。
[]
不进行任何边界检查,因此您不会收到任何警告或错误,例如。如果这样做,程序将具有未定义的行为,这意味着您将无法保证它的行为方式。(*arr1)[10]
如果希望在索引越界时引发异常,请使用 而不是 .arr1->at(10)
(*arr1)[10]
与仅使用 堆相比,堆分配不太可能有显著的好处,但会给手动管理其生存期带来额外的麻烦。std::array
std::vector
只需改用,它还将为堆上的元素分配内存:std::vector
std::vector<int> arr1(3);
arr1[0] = 1; // ok
arr1.at(10) = 1; // throws out-of-bounds exception
评论
(*arr1)[0] = 1;
std::array
operator[]