在c ++中删除3d动态数组

时间:2016-03-22 02:07:14

标签: c++ arrays pointers multidimensional-array dynamic-arrays

我做了一个初始化动态3d数组的函数

void initialize_array_3d(char ***Array, int size1, int size2, int size3)
{
    Array = new char**[size1];
    for (int t=0; t<size1+1; t++)
    {
        Array[t] = new char *[size2];
        for (int r=0; r<size2+1; r++)
        {
            Array[t][r] = new char [size3];
        }
    }
}

它工作正常,但当我尝试用函数

删除它时
void deinitialize_array_3d(char ***Array, int size1, int size2)
{
    for (int t=0; t<size1+1; t++)
    {
        for (int r=0; r<size2+1; r++)
        {
            delete[] Array[t][r];
        }
        delete[] Array[t];
    }
    delete[] Array;
}

我的程序崩溃了,为什么?以及如何解决它?

主要:

int main()
{
    char ***Failed;
    initialize_array_3d(Failed, 5, 4, 2);
    deinitialize_array_3d(Failed, 5, 4);
    Failed = nullptr;
    return 0;
}

2 个答案:

答案 0 :(得分:0)

您正在使用size1 + 1循环播放数组而不是size1,但由于数组是size1,因此您无法访问元素size1。在初始化中你正在逃避它(它是未定义的行为),但你不能删除你不拥有的内存,所以你的程序崩溃了。

<小时/> 请考虑使用std::vector代替。

答案 1 :(得分:0)

对于初学者来说,函数initialize_array_3d是错误的。它应该至少看下面的方式

void initialize_array_3d( char ****Array, int size1, int size2, int size3 )
                          ^^^^^^^^^^^^^^
{
    *Array = new char**[size1];

    for ( int t = 0; t < size1; t++ )
                     ^^^^^^^^^
    {
        ( *Array )[t] = new char *[size2];

        for ( int r = 0; r < size2; r++ )
                         ^^^^^^^^^
        {
            ( *Array )[t][r] = new char [size3];
        }
    }
}

这是应该使用指针间接传递的第一个参数。

函数调用可能看起来像

initialize_array_3d( &Failed, 5, 4, 2);
                     ^^^^^^^

否则参数char ***Array是函数的局部变量,函数处理参数的副本。局部变量的任何更改都不会影响原始参数。

或者您可以将参数声明为对pojnter的引用。例如

void initialize_array_3d( char *** &Array, int size1, int size2, int size3 )
                          ^^^^^^^^^^^^^^
{
    Array = new char**[size1];

    for ( int t = 0; t < size1; t++ )
                     ^^^^^^^^^
    {
        Array[t] = new char *[size2];

        for ( int r = 0; r < size2; r++ )
                         ^^^^^^^^^
        {
            Array[t][r] = new char [size3];
        }
    }
}

在这种情况下,函数调用可能看起来像

initialize_array_3d( Failed, 5, 4, 2);
                     ^^^^^^  

对于函数deinitialize_array_3d,它应该看起来像

void deinitialize_array_3d(char ***Array, int size1, int size2)
{
    for ( int t = 0; t < size1; t++ )
                     ^^^^^^^^^ 
    {
        for ( int r = 0; r < size2; r++ )
                         ^^^^^^^^^
        {
            delete[] Array[t][r];
        }
        delete[] Array[t];
    }

    delete[] Array;
}