c -我如何在主函数中释放我在定义函数中分配的内存?



我一直在与动态分配和释放它作斗争,我知道我一直有这个函数的内存泄漏问题,但我不知道如何正确地释放它。

在这个函数中,t被分配了malloc,然后返回给main函数:

double** transpose(int r, int c , double** arr) {
double** t  = (double**) malloc(sizeof(double*) * c);
for (int i = 0; i < c; i++) {
t[i] = (double*) malloc(sizeof(double) * r);
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
t[j][i] = arr[i][j];
}
}
return t;
}

这是最后需要释放的主要函数。让我困惑的是,我知道我需要循环到变量c并执行free(t[I]),但是该变量超出了main中的作用域,因为它没有在那里声明。所以我不确定你应该如何访问它免费:

int main (int argc, char** argv){
FILE* fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("errorn");
return 0;
}
fseek (fp, 0, SEEK_END);
if (ftell(fp) == 0) {
return 0;
}

FILE* fp2 = fopen(argv[2], "r");
if (fp2 == NULL) {
printf("error");
return 0;
}
fseek (fp2, 0, SEEK_END);
if (ftell(fp2) == 0) {
return 0;
}
rewind(fp);
rewind(fp2);

int k = 0; 
int n = 0;
double z = 0.0;
fscanf(fp, "%d", &k);
fscanf(fp, "%d", &n);
double** x = (double **) malloc(sizeof(double*) * n); 
double** y = (double **) malloc(sizeof(double*) * n);
for (int i = 0; i < n; i++) {
x[i] = (double*) malloc((k + 1) * sizeof(double));
y[i] = (double*) malloc(sizeof(double));
for (int j = 0; j < (k + 2); j++) { 
if (j == 0) { 
x[i][j] = 1;
} else if (j == k + 1) { 
fscanf(fp, "%lf", &z);
y[i][0] = z;
} else { 
fscanf(fp, "%lf,",&z);
x[i][j] = z;
}
}
}
int m = 0;
fscanf(fp2, "%d", &m);
double** test = (double**) malloc(m * sizeof(double*));
for (int i = 0; i < m; i++) {
test[i] = (double*) malloc((k+1) * sizeof(double));
for (int j = 0; j < (k+1); j++) {
if (j != 0) {
if (j == k+1) {
fscanf(fp2, "%lf", &z);
test[i][j] = z;
}else {
fscanf(fp2, "%lf,", &z);
test[i][j] = z;
}
} else { 
test[i][j] = 1;
}
}
} 
double** xt = transpose(n, (k+1), x);
double** xxt = multiply((k+1), n, n, (k+1), xt, x);
double** ixxt = inverse(k+1, xxt);
double** ixxtxt = multiply((k+1), (k+1), (k+1), n,  ixxt, xt);
double** w = multiply((k+1), n, n, 1, ixxtxt, y);

double** ans = multiply(m, (k+1), (k+1), 1, test, w);
print(m, 1, ans);
fclose(fp);
fclose(fp2);
return 0;
}

假设所有其他计算函数(multiply等)不分配内存,您可以编写以下函数。使用分离的函数是为了使代码更好地可维护,这是一个设计决策。

void release(int c, double** p) {
for (int i = 0; i < c; i++) {
free(p[i]);
}
free(p);
}

注1:如果其他计算函数分配了额外的内存,您也可以使用它们返回的指针调用release()

注2:如果其他计算函数返回相同的指针当它们作为参数接收时,您并不真正需要这个,因为值"在适当的地方"被更改了。

可以修改返回类型为void

相关内容

  • 没有找到相关文章

最新更新