2014-09-30 6 views
0

У меня возникли проблемы с удалением 3D-массива. Это, по-видимому, вызывает ошибку сегментации в моем коде. Это то, что у меня есть. Ошибка сегментации вызвана удалением 3D-массива, но я не знаю, почему.Удалить 3D-массив вызывает ошибку сегментации

int main(int argc, char** argv) 
{ 
    //variables 
    ifstream inputFileStream[ argc - 2 ]; 
    int ***dimensions; 

    //open inputFileStream and read in values... 

    //creating the dynamic 3D array and reading in grey values 
    dimensions = new int**[ argc - 2 ]; 
    for(int i = 0; i < argc - 2; i++) 
    { 
     dimensions[ i ] = new int*[ width ]; 
     for(int j = 0; j < width; j++) 
     { 
      dimensions[ i ][ j ] = new int[ height ]; 
      for(int k = 0; k < height; k++) 
      { 
       inputFileStream[ i ] >> dimensions[ i ][ j ][ k ]; 
      } 
     } 
    } 

    //do something with array 

    //delete array 
    for(int i = 0; i < width; i++) 
    { 
     for(int j = 0; j < height; j++) 
     { 
      delete[] dimensions[ i ][ j ]; 
     } 
     delete[] dimensions[ i ];   
    } 
    delete[] dimensions; 
} 
+0

Что такое ценность 'width'? – streppel

+0

Вы удаляете массив в любом другом месте? это может быть удаление копии указателя, не обязательно должно быть фактическим указателем 'dimension'. –

+0

Im не удалять массив в любом другом месте. Значение ширины зависит от того, какой файл вы вложили, но в этом случае это 495. –

ответ

1

При распределении, ваш «я» значение от 0 до «ARGC-2», ваше значение «J» идет от 0 до «ширины» и ваше значение «к» соответствует «высоте». При удалении значение «i» изменяется от 0 до «width», а ваше значение «j» изменяется от 0 до «height». Тем не менее вы индексируете [i] [j] в обоих случаях. Это непротиворечиво.

0

Вот полный, но упрощенный пример кода, который работает:

int main(int argc, char** argv) 
{ 
    //variables 
    int ***dimensions; 

    //creating the dynamic 3D array and reading in grey values 
    dimensions = new int**[ 10 ]; 
    int width = 10; 
    int height = 20; 
    for(int i = 0; i < 10; i++) 
    { 
     dimensions[ i ] = new int*[ width ]; 
     for(int j = 0; j < width; j++) 
      dimensions[ i ][ j ] = new int[ height ]; 
    } 

    for(int i = 0; i < 10; i++) 
    { 
     for(int j = 0; j < width; j++) 
      delete[] dimensions[ i ][ j ]; 
     delete[] dimensions[ i ];   
    } 
    delete[] dimensions; 
} 

Как вы можете видеть, петли над 10 и width. height не играет никакой роли в логике цикла. Поэтому проблема заключается в том, что вы потеряли информацию о том, как разматывать 3 измерения, ошибочно используя height в качестве ограничения внутреннего контура.

Смежные вопросы