3D阵列解除分配会导致分段错误

Xar*_*ara 0 c++ arrays

我正在使用三维数组.我这样声明:

int (*DoubleStride_StateTable)[255][255] = new int[StateTable_length][255][255];
Run Code Online (Sandbox Code Playgroud)

我像这样解除分配3D数组:

for( int i = 0 ; i < 255 ; i++ )
{
    for( int j = 0 ; j < 255 ; j++ )
    {
        cout << i << " " << j << endl;
        delete[] DoubleStride_StateTable[i][j] ;
    }
    delete[] DoubleStride_StateTable[i] ;
}
delete[] DoubleStride_StateTable;
Run Code Online (Sandbox Code Playgroud)

循环只运行两次,即

i=0 j=0
i=0 j=1
Run Code Online (Sandbox Code Playgroud)

然后发生分段错误

我正在做正确的解除分配吗?为什么会出现此错误?

Mar*_*rio 6

你在这里的问题是你释放的东西你不应该自己解脱.(或者更具体一点:您试图多次释放已分配内存的部分内容.)

基本经验法则:如果您使用new一次请求内存,那么您也必须只使用delete一次.对于数组也是如此:如果你使用new[]一次,你也必须只使用delete[]一次.

你只需要这条线

delete[] DoubleStride_StateTable;
Run Code Online (Sandbox Code Playgroud)

释放声明中保留的所有内存.

迭代所有元素/级别并释放元素只有在以相同方式创建3D数组时才需要(创建指针数组,然后迭代它并指定另一个级别).