Я использую трехмерный массив. Я заявляю следующее:
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
и после этого возникают сбои сегментации
Я делаю правильное освобождение? Почему эта ошибка возникает?
Ваша проблема заключается в том, что вы освобождаете вещи, которые не должны освобождать себя. (Или более конкретно: вы пытаетесь освободить часть выделенной памяти несколько раз.)
Основное правило: Если вы запрашиваете память, используя new
один раз, то вы должны использовать только delete
один раз, а также. То же самое верно для массивов: если вы используете new[]
один раз, вы должны использовать только delete[]
один раз.
Вам понадобится только линия
delete[] DoubleStride_StateTable;
чтобы освободить всю память, которая была зарезервирована в вашем объявлении.
Итерация по всем элементам/уровням и освобождению элементов так, как вы делали, необходима только тогда, когда вы создаете свой 3D-массив одинаково (создавая массив указателей, затем повторяя его и назначая другой уровень).
delete[] DoubleStride_StateTable
.new
? Теперь , сколькоdelete
-s есть?