我在函数中分配内存,并返回char *,我应该如何释放它?

时间:2015-04-29 09:34:22

标签: c pointers malloc free lifetime

如果我想在功能中分配内存:

char* allocate() {
    char *cp = (char*)malloc(10);
    ...
    return cp;
}

我可以使用cp main()中返回的内容吗?以及如何免费cp

3 个答案:

答案 0 :(得分:5)

  

我可以在main()中使用cp中返回的内容吗?

是的,你可以。

  

以及如何释放cp?

使用

free(cp); // Replace cp with the name of the pointer if you are using it in another function

<小时/> 此外,您should not cast the result of malloc(and family) in C

答案 1 :(得分:2)

您应始终malloc(3)的失败进行测试,因此至少使用perror(3)&amp; exit(3)喜欢:

  char *cp = malloc(10);
  if (!cp) { perror("malloc"); exit(EXIT_FAILURE); };

某些 Linux系统正在启用memory overcommit。这是一个您应该禁用的脏功能。

如果您正在认真编码(例如,一个强大的库供其他人使用),您可能需要提供更复杂的内存不足错误恢复(可能有一个约定,每个分配例程都可以返回NULL失败)。 YMMV。

的确,稍后您需要使用cp中的指针调用free(3)。如果你不这样做,你将拥有memory leak。之后你不允许使用即取消引用指针(注意pointer aliases)或简单地将它与其他指针进行比较;它将是undefined behavior

有一个约定对于何时以及应该致电free的人来说非常重要。你应该记录那个惯例。定义和实施此类约定并非易事。

在Linux上,您可以使用非常有用的工具来帮助C dynamic memory allocationvalgrind,将-Wall -Wextra -g(以获取所有警告和调试信息)传递给GCC编译器,传递-fsanitize=address到最近gcc等等。

另请阅读garbage collection;至少得到一些术语,比如reference counting。在某些 C应用程序中,您稍后可能希望使用Boehm's conservative GC

答案 2 :(得分:1)

  

1。我可以在main()中的cp中使用返回的内容吗?

是的,你可以。动态分配的内存(在堆上)的范围和生命周期不限于函数范围。它仍然有效,直到free() d。

注意:请务必检查malloc()do not cast返回值是否成功。

  

2。以及如何释放cp?

使用内存,main()或任何其他功能后,您可以致电free(<pointer>);,其中<pointer>是您收集回报的变量价值allocate()