3

我使用此代码制作了一个 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;

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

请帮我检查代码,谢谢

4

3 回答 3

10

您为具有维度的数组分配内存[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;
于 2013-05-05T03:26:36.793 回答
1

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

level_array = nullptr;

于 2016-03-15T04:02:20.703 回答
0

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

#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-09-23T22:03:40.497 回答