Двойное освобождение или повреждение — освобождение памяти для матрицы в C

#c #matrix #memory-management #memory-leaks

#c #матрица #управление памятью #утечки памяти

Вопрос:

У меня есть эта программа для вычисления определителя матрицы с использованием метода Лапласа. Это работает нормально, но когда дело доходит до освобождения памяти, происходит сбой, когда я пытаюсь использовать deleteMatrix() внутри det() функции. Матрица загружается из текстового файла, но я уверен, что все в порядке, поэтому я пропускаю эту часть кода.

Ошибка, которую я получаю: *** Error in ./prog: double free or corruption (out): 0x00000000008a0910 *** я думаю, что я могу где-то превысить массив, но я не могу его найти. Моя цель — не допустить утечек памяти в этом коде.

 #include <stdio.h>
#include <stdlib.h>

//...
// text file reading and matrix creating functions
//...

void deleteMatrix(double** matrix, int n){

    int i,j;
    for(i = 0; i < n; i  ){
        free(matrix[i]);
    }
    free(matrix);
}

double** createMinor(double** matrix, int n, int banned){

    double** minor = (double**)calloc(n-1, sizeof(double*));
    int i,j;
    int i2 = 0, j2 = 0;

    for(i=0; i<n; i  ){
        minor[i] = (double*)calloc(n-1, sizeof(double));

        for(j=0; j<n; j  ){

            if(i != 0 amp;amp; j != banned){

                if(j2<n-1){
                    minor[i2][j2] = matrix[i][j];
                    j2  ;

                }else{
                    i2  ;
                    minor[i2][0] = matrix[i][j];
                    j2 = 1;
                }
            }
        }
    }
    return minor;   
}

double det(double** matrix, int n){

    double sum = 0.0;
    double sign = 1.0;
    int i;

    double** minor = (double**)calloc(n - 1, sizeof(double*));

    if(n==1)
        return matrix[0][0];
    if(n==2)
        return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0];

    for(i=0; i<n; i  ){
        //creating submatrix

        minor = createMinor(matrix, n, i);
        //-----------

        sum = sign*matrix[0][i]*det(minor,n-1);
        sign = -sign;

    };

    deleteMatrix(matrix, n);   // <---- line causing error

    return sum;
}

int main(int argc, char* argv[]){

    //-------------------------------
    //Reading matrix from a text file

    const char* filename = "file.txt";

    FILE *fp = fopen(filename, "r");
    if(fp == NULL){
        puts("Error - opening file");   
        exit(1);
    }

    double size = findSize(fp);
    double** matrix = createMatrix(fp, size);
    //-------------------------------

    double deter = det(matrix, size);

    printf("Determinant: %fn", deter);

    deleteMatrix(matrix, size);
    fclose(fp);
    return 0;
}
 

Комментарии:

1. Где это createMatrix ? Пожалуйста, опубликуйте минимальный автономный пример, который воспроизводит ошибку.

2. calloc(n-1, —> calloc(n,

3. Вы удаляете matrix дважды, один раз в функции det и один раз в функции main . А также утечка minor в функции det.

4.@2501 @BLUEPIXY Спасибо, это мне очень помогло, но у меня все еще есть утечка памяти, вызванная этими строками (я их немного изменил): double** minor = (double**)calloc(n, sizeof(double*)); sum = sign*matrix[0][i]*det(minor,n-1-i); внутри det() и double deter = det(matrix, size); внутри main() . Есть предложения?

5. calloc (n-1) должно быть calloc(n,)