【问题标题】:Deleting 3d dynamic array C++删除 3d 动态数组 C++
【发布时间】:2013-05-05 03:13:19
【问题描述】:

我使用此代码制作了一个 3d 动态数组

//layer = 2

//levelSize.x = 100

//levelSize.y = 100

level_array = new int**[layer];

    for(int i = 0; i < layer; ++i)
    {
        level_array[i] = new int*[(int)levelSize.x];
        for(int j = 0; j < levelSize.x; ++j)
            level_array[i][j] = new int[(int)levelSize.y];
    }

但是当我想删除它时,程序崩溃了

for(int i = 0; i != levelSize.x; ++i)
    {
        for(int j = 0; j != levelSize.y; ++j)
        {
            delete[] level_array[i][j];
        }
        delete[] level_array[i];

    }
    delete[] level_array;

不知道删除数组的代码哪里出错了。

请帮我检查一下代码,谢谢

【问题讨论】:

  • 好久没做C++了,不应该delete[] level_array删除数组吗?
  • @zachlatta,不是递归的。
  • 我首先质疑有一个 3D 数组,但使用 std::vector 或类似方法(最好将它包装在一个带有 1D 数组的 Matrix3D 类中),你不必删除任何东西.
  • 很可能,程序崩溃是因为您在某处超出了数组边界。

标签: c++


【解决方案1】:

您为维度为 [layer][levelSize.x][levelSize.y] 的数组分配内存,但在删除时您像使用维度为 [levelSize.x][levelSize.y][somenting] 的数组一样操作它。

for(int i = 0; i != layer; ++i)
//                  ^^^^^ not levelSize.x
{
    for(int j = 0; j != levelSize.x; ++j)
    //                  ^^^^^^^^^^^ not levelSize.y
    {
        delete[] level_array[i][j];
    }
    delete[] level_array[i];

}
delete[] level_array;

【讨论】:

  • 为什么不需要这样做:删除 level_array[i][j][k] 其中 k 从 0 迭代到 levelSize.y ?
  • 因为level_array[i][j][k] 是一个值,而不是一个分配的数组
【解决方案2】:

将此命令添加到末尾,否则指针将在堆栈顶部。

level_array = nullptr;

【讨论】:

  • @T Nguyen:是的,将指针分配给 null 效率太高,这意味着它指向 NULL 地址而不是前一个地址,因为删除只会释放内存。这在尝试取消引用 NULL 指针时会有所帮助,这会导致我们意识到段错误中的问题。如果我们取消引用一个已删除的指针而不给它分配 NULL,它可能会给我们一个垃圾值而不抱怨,这就是灾难
  • 在这种情况下,最好的选择就是使用std::unique_ptr
【解决方案3】:

区分删除单个dim数组和分配在堆上的多dim非常重要:

#include <iostream>
using std::cout;
using std::endl;

int main()
{

    int*** ptrInt = new int**[3];

    for(int i(0); i < 3; i++)
        ptrInt[i] = new int*[3];

    for(int i = 0; i < 3; i++)
    {
        for(int j(0); j < 3; j++)
            ptrInt[i][j] = new int[3];
    }


    for(int i = 0; i < 3; i++)
    {
        for(int j(0); j < 3; j++)
            for(int k(0); k < 3; k++)
                ptrInt[i][j][k] = k;
    }

    for(int i = 0; i < 3; i++)
    {
        for(int j(0); j < 3; j++)
            for(int k(0); k < 3; k++)
                cout << "ptrInt[" << i << "][" << j << "][" << k << "]: " << ptrInt[i][j][k] << endl;
    }

    // now freeing memory:

    for(int i = 0; i < 3; i++)
    {
        for(int j(0); j < 3; j++)
            delete[] ptrInt[i][j];
        delete[] ptrInt[i];
    }
    delete[] ptrInt;


    cout << endl << endl << endl;
    return 0;
}

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 2017-03-29
    • 2018-10-02
    • 2013-12-25
    • 2016-04-12
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2015-06-17
    相关资源
    最近更新 更多