#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,)