Удалить [], вызывая ошибку сегментации?

Может кто-нибудь сказать мне, почему вызов моей функции delete2DMatrix вызывает ошибку сегментации при запуске на G++ в Ubuntu?

Я запускаю его в CLion, и он отлично работает и не генерирует ошибку сегментации, поэтому я очень запутался, почему он вызывает ошибку сегментации в G++. Я подтвердил, что это функция удаления, вызывающая ошибку сегментации. Если я уберу функцию, все выполнится идеально.

Моя функция:

void delete2DMatrix(int ***matrix, int rows){
    for(int i=0; i < rows; i++){
        delete [] matrix[i];
    }
    delete [] matrix;
}

Это моя функция для создания матрицы, так что вы можете видеть, что я сделал вызов new:

int **create2DMatrix(int rows, int columns){
     int **matrixPtr;
     matrixPtr = new int *[rows];

     for(int i = 0; i < rows; i++){
         matrixPtr[i] = new int [columns];
     }

     //Sets all values to the default 0
     for(int i =0; i< rows; i++){
         for (int a = 0; a < columns; a++){
             addMatrixValue(matrixPtr, i, a, 0);
         }
     }

     return matrixPtr;
 }

Я подтвердил, что передаваемый указатель фактически указывает на матрицу. Я также смог добавить значения в матрицу без проблем. Только когда я вызываю эту функцию удаления и только в G++, она вызывает ошибку сегментации и обнаруживает утечку памяти.

Спасибо всем заранее.

2 ответа

Судя по тому, как память была выделена для матрицы,

void delete2DMatrix(int ***matrix, int rows){
   ...
}

не является правильным. Использование:

//                      ||
//                      vv Don't need the additional pointer.
void delete2DMatrix(int **matrix, int rows){
   ...
}

В комментарии вы сказали:

Я не могу изменить матрицу *** при удалении, потому что мой профессор создал объявления, и нам не разрешено их менять. При оценке он использует свой собственный файл.h, поэтому я должен использовать матрицу ***.

В этом случае вам нужно будет использовать:

void delete2DMatrix(int ***matrix, int rows){
    int** ptr = *matrix;
    for(int i=0; i < rows; i++){
        delete [] ptr[i];
    }
    delete [] ptr;

    // I am guessing that your professor wants to have *matrix
    // set to nullptr in this function.
    *matrix = nullptr
}

Кажется, привычки вашего профессора по кодированию все еще похожи на C. Если они хотели установить значение matrix в nullptr, они могли бы использовать идиому C++ и передавать ссылку на переменную.

void delete2DMatrix(int**& matrix, int rows){
    for(int i=0; i < rows; i++){
        delete [] matrix[i];
    }
    delete [] matrix;
    matrix = nullptr
}

Кажется, вы имеете в виду следующее

void delete2DMatrix(int ***matrix, int rows){
    for(int i=0; i < rows; i++){
        delete [] ( *matrix )[i];
    }
    delete [] *matrix;

    *matrix = NULL; // or *matrix = nullptr;
}

То есть функция принимает указатель на указатель типа **matrix,

Таким образом, внутри функции вы должны сначала разыменовать указатель, как показано выше.)

Другие вопросы по тегам