Итак, у меня возникли проблемы с удалением 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
Alex Caruso 30 Сен 2014 в 21:55

2 ответа

Лучший ответ

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

1
iwolf 30 Сен 2014 в 18:29

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

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 в качестве ограничения внутреннего цикла.

0
PaulMcKenzie 30 Сен 2014 в 18:45