我正在使用三维数组。我这样声明:
int (*DoubleStride_StateTable)[255][255] = new int[StateTable_length][255][255];
我按照这样解除了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;
循环只运行两次,即
i=0 j=0
i=0 j=1
然后发生分段错误
我做了正确的解除分配吗?为什么会出现此错误?
答案 0 :(得分:6)
你的问题在于你释放的东西你不应该自己解脱。 (或者更具体一点:你试图多次释放你分配的内存部分。)
基本经验法则:如果您使用new
一次请求内存,那么您也必须只使用delete
一次。对于数组也是如此:如果您使用new[]
一次,则只能使用delete[]
一次。
你只需要一行
delete[] DoubleStride_StateTable;
释放声明中保留的所有内存。
迭代所有元素/级别并释放元素只有在以相同方式创建3D数组时才需要(创建指针数组,然后迭代它并指定另一个级别)。