任何人都可以告诉我为什么在ubuntu中使用G ++运行时调用我的delete2DMatrix函数会导致分段错误?
我在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 ++中它才会抛出分段错误并检测到内存泄漏时。
提前全部谢谢。
答案 0 :(得分:3)
根据为矩阵分配内存的方式来判断,
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
}
答案 1 :(得分:1)
看来你的意思是以下
void delete2DMatrix(int ***matrix, int rows){
for(int i=0; i < rows; i++){
delete [] ( *matrix )[i];
}
delete [] *matrix;
*matrix = NULL; // or *matrix = nullptr;
}
即函数接受指向**matrix
类型指针的指针。
因此,在函数中,您首先要取消引用指针,如上所示。)