【问题标题】:"malloc in local function, free memory in main" is it ok? How? [duplicate]“本地函数中的malloc,main中的空闲内存”可以吗?如何? [复制]
【发布时间】:2015-08-19 13:33:39
【问题描述】:

我在书中了解到,如果我需要从函数返回一个指针,我使用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;
}

【问题讨论】:

  • see why not to castmalloc()C中的family返回值。
  • @shinhwa 你在这里遗漏了一个严重的问题。
  • @SouravGhosh 你忽略了一个严重的问题,我的朋友。
  • @Sumeet 请赐教。
  • @SouravGhosh 查看我的回答。

标签: c pointers memory-management free


【解决方案1】:

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

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

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

free (presult);

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


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

  1. see why not to cast malloc() 和C 中的family 的返回值。
  2. 在使用返回的指针之前,始终检查malloc() 是否成功。

也就是说,只是一个建议,请始终尝试使用表单

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

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

【讨论】:

  • 感谢您的 cmets 和解释。我意识到了第二个方面,我正在学习第一个。
  • 就语法和功能而言,代码是正确的,但它是糟糕的程序设计。
【解决方案2】:

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

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

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

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

【讨论】:

  • 说得好,我认为还有一个问题被遗漏了。
  • @Sumeet 悬空指针仅在期望使用相同输入再次调用例程时才会出现问题。在这种情况下,由执行 malloc/free 的例程来处理它。
  • 但是仍然让它为 NULL 是一件好事,你不觉得吗。
  • @Sumeet 这完全取决于代码的性质和功能。它可能非常好和必要,也可能是多余的混乱。
猜你喜欢
  • 2020-08-12
  • 2014-03-14
  • 1970-01-01
  • 2013-11-27
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2017-01-10
相关资源
最近更新 更多