Удалить [], вызывая ошибку сегментации?
Может кто-нибудь сказать мне, почему вызов моей функции 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
,
Таким образом, внутри функции вы должны сначала разыменовать указатель, как показано выше.)