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

0 c++ arrays dynamic std heap-memory

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

\n

这是我尝试过的:

\n
std::array<int,3> *arr1; \narr1 = new std::array<int,3>;\narr1[0] = 1;\n
Run Code Online (Sandbox Code Playgroud)\n

但是,我得到的错误是:

\n

错误:与 \xe2\x80\x98operator*\xe2\x80\x99 不匹配(操作数类型为 \xe2\x80\x98std::array\xe2\x80\x99)。

\n

我也尝试过:

\n
arr1[0][0] = 1;\n
Run Code Online (Sandbox Code Playgroud)\n

这有效,但也有效:

\n
arr1[5][5] = 2;\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

我在这里做错了什么?

\n

use*_*522 5

访问数组的正确语法是*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
Run Code Online (Sandbox Code Playgroud)