函数内部的内存泄漏,它返回一个指针(已解决)

问题描述 投票:2回答:1

我正在使用一个函数,该函数集成了多项式,该多项式作为指针参数提供给该函数。在函数内部,我使用malloc以便为将要返回的积分多项式分配内存。

问题是,在将其返回到主函数之前,我无法释放它,原因是我什么也不会返回。但是,如果我在返回它之后释放了它,那么我显然什么也没做,因为程序将在读取释放之前返回主函数。

这里是功能。

double * integrar(int n, double *dp, double *mitjana) {

double *p, mitj = 0;
int i;

p = (double *)malloc((n + 2)*sizeof(double));
if(p == NULL) {printf("\nError de memoria.\n"); exit(1);}

p[0] = 1;

for(i = 1; i <= n + 1; i++)
    p[i] = dp[i - 1]/i;

for(i = 0; i <= n + 1; i++)
    mitj += p[i];

mitj = mitj/(n + 2);
*mitjana = mitj;

return p; }

我需要以某种方式免费这是主要功能:

int main(void) {

int n, k, i, j;
double mitjmax, mitjaux, **p;
mitjmax = 0;

printf("Dona el grau del polinomi.\n");
scanf("%d", &n);
printf("\nDona el nombre de vegades que el vols integrar.\n");
scanf("%d", &k);

p = (double **)malloc((k + 1)*sizeof(double *));
if(p == NULL) {printf("\nError de memoria.\n"); exit(1);}
for(i = 0; i < k + 1; i++) {
    p[i] = (double *)malloc((n + 1 + i)*sizeof(double));
    if(p[i] == NULL) {printf("\nError de memoria.\n"); exit(1);}
}

printf("\nDona el polinomi.\n");
for(i = 0; i <= n; i++)
    scanf("%le", &p[0][i]);

for(i = 0; i <= n; i++)
    mitjmax += p[0][i];
mitjmax = mitjmax/(n + 1);

for(i = 1; i <= k; i++) {
    p[i] = integrar(n + i - 1, p[i - 1], &mitjaux);
    if(mitjaux > mitjmax)
        mitjmax = mitjaux;
}

for(i = 0; i <= k; i++) {
    printf("grau %d:", i + n);
    for(j = 0; j <= n + i; j++)
        printf("%11.4le ", p[i][j]);
    printf("\n");
}
printf("El maxim de les mitjanes dels coeficients: %le\n", mitjmax);

for(i = 0; i <= k; i++)
    free(p[i]);
free(p);

return 0;
}
c
1个回答
2
投票

只要您对其进行了正确记录,就不会释放malloc()的内存,然后将其返回给调用者,这没有什么错。

特别是在库中,调用者必须意识到释放内存的可能性,而且这样做也必须很明显。

但是,在调用者面前,您必须知道指针会发生什么以及如何使用它。您可以看到对integrar()的调用是对malloc()的(间接)调用,所以真正的问题是分配给p[i] = (double *)malloc((n + 1 + i)*sizeof(double));,然后分配p[i] = integrar(n + i - 1, p[i - 1], &mitjaux);,而没有中间free(p[i]),因为然后是第一个malloc()内存基本上丢失了。

© www.soinside.com 2019 - 2024. All rights reserved.