0 c++ arrays dynamic std heap-memory
在堆上分配 std::array 时遇到一些麻烦。
\n这是我尝试过的:
\nstd::array<int,3> *arr1; \narr1 = new std::array<int,3>;\narr1[0] = 1;\nRun Code Online (Sandbox Code Playgroud)\n但是,我得到的错误是:
\n错误:与 \xe2\x80\x98operator*\xe2\x80\x99 不匹配(操作数类型为 \xe2\x80\x98std::array\xe2\x80\x99)。
\n我也尝试过:
\narr1[0][0] = 1;\nRun Code Online (Sandbox Code Playgroud)\n这有效,但也有效:
\narr1[5][5] = 2;\nRun Code Online (Sandbox Code Playgroud)\n这不应该工作,因为 std::array<int, 3> 指示数组大小应该只有 3 个整数。
\n我在这里做错了什么?
\n访问数组的正确语法是*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)