如何在免费商店上用 C++ 分配 3D 数组?

时间:2021-03-31 02:24:35

标签: c++ arrays pointers dynamic-memory-allocation

我目前正在学习如何在 C++ 中使用原始指针。我了解如何动态分配 2D 数组,但是,作为我自己的练习,我尝试应用我对多个间接级别的理解来分配 3D 数组。我的尝试如下:

int main() {

    double*** matrix { new double**[10] {} };

    for (size_t i {}; i < 10; ++i) {

        matrix[i] = new double*[i + 1] {};

        for(size_t j {}; j < 10; ++j) {

            matrix[i][j] = new double[i + 1] {};
        }

    }

    std::cout << matrix[0][0][0] << std::endl;

    for (size_t i {}; i < 10; ++i) {

        for (size_t j {}; j < 10; ++j) {
            delete[] matrix[i][j];
            matrix[i][j] = nullptr;
        }

        delete[] matrix[i];
        matrix[i] = nullptr;

    }

    delete[] matrix;
    matrix = nullptr;

    return 0;

}

由于我使用的是统一初始化,matrix[0][0][0] 应该打印值 0.0;但是,这样做时我得到了垃圾值。此外,我有一个 double free or corruption (out) 错误,我认为它告诉我我正试图从同一地址释放内存两次。

任何帮助或指导将不胜感激。我只是想完全理解原始指针。

编辑:我知道 double*** 实际上不是 3D 数组。我只是想使用简单的术语。

1 个答案:

答案 0 :(得分:2)

matrix[i] = new double*[i + 1] {};
for(size_t j {}; j < 10; ++j) {

这是你的错误,你分配了一个 'i + 1' 元素的数组,然后循环 10,你要么需要在两个地方都有 i + 1 或 10,否则这是未定义的行为。这同样适用于删除(循环检查 10 但你只分配了 i + 1)。

相关问题