“本地功能中的malloc,主要的空闲内存”可以吗?怎么样? [重复]

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

这个问题在这里已有答案:

我在书中了解到,如果我需要从函数返回指针,我使用malloc()并从堆中获取内存。我想知道如何在功能之后free()分配内存。

可以做我在下面的代码中做的事情来释放那个内存吗?如果它不正确,在功能后释放内存的正确方法是什么?

int *Add_them_up (int *x, int *y)
{
    int *p = (int *) malloc(sizeof (int));
    *p = *x + *y;
    return p;
}


int main ()
{   
    int c = 3;
    int d = 4;
    int *presult = NULL;
    presult = Add_them_up (&c, &d);
    printf ("the result of adding is:%d\n", *presult);
    free (presult);
    return 0;
}
c pointers memory-management free
2个回答
6
投票

是的,您的代码是正确的。条件适用,请参阅下面的注释

要向free()分配内存,您只需要从malloc()和family传递返回的指针。

当你从malloc()函数返回Add_them_up()返回的相同指针并将其存储在presult中时,在main()函数中你可以调用

free (presult);

没有任何问题。它将执行预期的工作。


注意:您在这里缺少两个方面,例如:

  1. see why not to cast malloc()和C家族的回归价值。
  2. 在使用返回的指针之前,请务必检查malloc()是否成功。

也就是说,只是一个建议,总是尝试使用表格

int *p = malloc(sizeof(*p));

这使得分配语句独立于p的类型,从而产生最强大的代码。


4
投票

这通常被认为是糟糕的程序设计。执行malloc()的模块应该被设计为它还负责执行free()。

你永远不应该设计程序,以便一些外部例程可以清理模块中的混乱。这真的是常识。

所以在这种情况下,你应该在free()周围添加一个包装函数,main()可以调用它。 main()不需要知道或关心你的例程如何执行动态分配/释放。

请注意,不遵循此程序设计的程序往往会出现与内存泄漏相关的错误。

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