删除导致分段错误的 []

Delete [] causing segmentation fault?

本文关键字:错误 分段 删除      更新时间:2023-10-16

谁能告诉我为什么在 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++ 中时,它才会抛出分段错误并检测内存泄漏。

提前谢谢大家。

从为矩阵分配内存的方式来看,

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
}
<</div> div class="answers">

看来你的意思如下

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

也就是说,该函数接受指向类型为 **matrix 的指针的指针。

因此,在函数中,您首先必须取消引用指针,如上所示。