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

I allocate memory in function, and return char*, how should I free it?

如果我想在函数中分配内存:

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

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

can I use the returned content in cp in main()?

是的,你可以。

and how to free 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. can I use the returned content in cp in main()?

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

注意:始终检查 malloc()do not cast 是否成功,它是 return 值。

2. and how to free cp?

main() 或任何其他函数使用完内存后,您可以调用 free(<pointer>);,其中 <pointer> 是您在其中收集的变量allocate().

的 return 值

你应该总是测试malloc(3), so at least use perror(3) & exit(3)的失败,比如:

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

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

如果你认真地编码(例如,一个健壮的库供其他人使用),你可能需要提供更复杂的内存不足错误恢复(也许有一个约定,每个分配例程都可以 return NULL 失败)。 YMMV.

确实,稍后您需要调用 free(3) with the pointer in cp. If you don't you'll have a memory leak. After that you are not allowed to use i.e. dereference that pointer (be careful about pointer aliases) or simply compare it against some other pointer; it would be undefined behavior

重要的是有一个约定关于什么时候和谁应该打电话给free。您应该记录该约定。定义和实施此类约定并不总是那么容易。

在 Linux 上,您有非常有用的工具来帮助 C dynamic memory allocation : valgrind, passing -Wall -Wextra -g (to get all warnings and debug info) to the GCC 编译器,将 -fsanitize=address 传递给最近的 gcc,等等

另请参阅 garbage collection; at least to get some terminology, like reference counting. In some C applications, you might later want to use Boehm's conservative GC