如何释放函数返回的指针?

时间:2012-08-09 22:32:12

标签: c memory dynamic malloc free

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* f(void) {
  char *x;
  x = malloc(sizeof(char) * 4);
  strcpy(x, "abc");
  return(x);
}

int main(void) {
  char *a;
  a = f();
  printf("%s", a);
  free(a);
  return(0);
}

是否必须释放函数中的变量x?如果是这样,当我需要退货时,这怎么可能呢?

6 个答案:

答案 0 :(得分:10)

  

是否必须释放函数中的变量x?

是的(有点,见我后来的评论)。每次拨打malloc都需要稍后拨打free。否则,你有泄漏。但请记住;你不是“自由x”,你释放了x所指的记忆。

当您返回x时,会生成x(地址)的副本并将其返回给调用者。声明x具有自动存储持续时间。它所引用的记忆必须被释放。

  

如果是这样,当我需要退回时,这是怎么回事。

您的设计已将责任放在呼叫者身上以释放内存。你已经完成了这个。当然,使用此方法需要您记录该函数,以便代码的用户知道他们正在接收动态分配的内存地址。

更好的方法(IMO)是将缓冲区作为输入参数。现在很清楚谁负责管理这个内存(即调用者)。也许我甚至不想动态分配它。有了这个设计,这是我的选择。

void f(char *buf, size_t buf_size) {
  strncpy(buf, "abc", buf_size - 1);
  buf[buf_size-1] = '\0';
}

在旁注中,您应该始终检查malloc的返回值。它可能会失败,在这种情况下将返回空指针。此外,sizeof(char)保证为1标准,因此您可以删除该位,只需说出malloc(n)

答案 1 :(得分:1)

是的,应该由来电者释放。例如您主要的free

当您在函数x中返回f时,地址的副本会传回给调用者。来电者可以在该地址上拨打free

答案 2 :(得分:1)

是的,你需要免费,但是当free(a); main a x被分配到行a = f();时,它已经被释放了}})。

答案 3 :(得分:1)

退出函数后,

x被销毁。 x的值是指向动态分配的对象的地址。退出函数后,该对象仍然存在。

要释放动态对象,您必须将x函数返回的f值传递给free函数。

答案 4 :(得分:0)

当你调用malloc时,它会分配内存并返回该内存块的初始地址。

在你的情况下,你将这个地址返回给被调用者,现在被调用者main负责解除分配。

释放内存块所需的唯一内容是初始地址,AFIK负责分配/释放内存,它使用相当复杂的算法,但程序只需要跟踪初始内存地址。这个地址可以像任何其他整数值一样存储或移动,因为在32位系统中,它只是一个int值。

答案 5 :(得分:0)

您的代码运行良好,您释放了a,这是由f进行malloced的字符串。