C++ 删除c+中的三维动态数组+;

C++ 删除c+中的三维动态数组+;,c++,arrays,pointers,multidimensional-array,dynamic-arrays,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++)

我做了一个初始化动态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];
        }
    }
}

您使用的是
size1+1
而不是
size1
在数组中循环,但由于数组的大小为
size1
,因此无法访问元素
size1
。在初始化过程中,您可以不受影响(这是未定义的行为),但是您不能删除您不拥有的内存,因此您的程序会崩溃。

考虑使用<代码> STD::向量< /代码>。

< P>初学者函数>代码> RealalZeZARYAYX3D 是错误的。它至少应该是这样的

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];
        }
    }
}
否则,参数
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];
        }
    }
}
对于函数
deinitialize\u array\u 3d
,它应该如下所示

initialize_array_3d( &Failed, 5, 4, 2);
                     ^^^^^^^
initialize_array_3d( Failed, 5, 4, 2);
                     ^^^^^^  
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;
}
void取消初始化\u数组\u 3d(字符***数组,整数大小1,整数大小2)
{
对于(int t=0;t
要解决这个问题,只需使用std::vector,这样就不用担心删除它了。
initialize_array_3d( Failed, 5, 4, 2);
                     ^^^^^^  
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;
}