删除[]导致分段错误?

时间:2018-01-21 22:10:59

标签: c++ segmentation-fault delete-operator

任何人都可以告诉我为什么在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 ++中它才会抛出分段错误并检测到内存泄漏时。

提前全部谢谢。

2 个答案:

答案 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类型指针的指针。

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