我在函数中分配内存,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。
如果我想在函数中分配内存:
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()
.
你应该总是测试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。