在 C++ 中删除 3d 动态数组
Deleting 3d Dynamic array in c++
我创建了一个初始化动态 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;
}
您正在使用 size1 + 1
而不是 size1
来循环遍历您的数组,但是由于数组属于 size1
,您无法访问元素 size1
。在初始化过程中你逃脱了它(这是未定义的行为),但你不能删除你不拥有的内存,所以你的程序崩溃了。
考虑改用 std::vector
。
对于初学者函数 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
是函数的局部变量,函数处理参数的副本。局部变量的任何更改都不会影响原始参数。
或者您可以将参数声明为对指针的引用。例如
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;
}
我创建了一个初始化动态 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;
}
您正在使用 size1 + 1
而不是 size1
来循环遍历您的数组,但是由于数组属于 size1
,您无法访问元素 size1
。在初始化过程中你逃脱了它(这是未定义的行为),但你不能删除你不拥有的内存,所以你的程序崩溃了。
考虑改用
std::vector
。
对于初学者函数 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
是函数的局部变量,函数处理参数的副本。局部变量的任何更改都不会影响原始参数。
或者您可以将参数声明为对指针的引用。例如
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;
}