【发布时间】:2015-04-29 09:34:22
【问题描述】:
如果我想在函数中分配内存:
char* allocate() {
char *cp = (char*)malloc(10);
...
return cp;
}
我可以使用cp从main()返回的内容吗?以及如何释放cp?
【问题讨论】:
标签: c pointers malloc free lifetime
如果我想在函数中分配内存:
char* allocate() {
char *cp = (char*)malloc(10);
...
return cp;
}
我可以使用cp从main()返回的内容吗?以及如何释放cp?
【问题讨论】:
标签: c pointers malloc free lifetime
我可以在main()中使用cp中返回的内容吗?
是的,你可以。
以及如何释放cp?
使用
free(cp); // Replace cp with the name of the pointer if you are using it in another function
malloc(and family) in C
【讨论】:
malloc释放分配的内存,那么就会出现内存泄漏。是的,您可以使用 strdup 来执行此操作。 strdup 是 malloc+strcpy ,仅此而已。
allocate 函数创建一个相应的deallocate 函数,调用代码必须调用该函数。这个deallocate 函数执行free 和/或解除分配对象所需的任何其他操作。
你应该总是测试malloc(3)的失败,所以至少使用perror(3)和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 allocation 问题:valgrind,将 -Wall -Wextra -g(用于获取所有警告和调试信息)传递给 GCC 编译器,将 -fsanitize=address 传递给最近的 @987654341 @等
另请阅读garbage collection;至少要获得一些术语,例如reference counting。在一些 C 应用程序中,您稍后可能想要使用Boehm's conservative GC。
【讨论】:
perror 而不是exit 是通常可以接受的,当然比不检查@的结果更可取987654344@
1.我可以在 main() 中使用 cp 中返回的内容吗?
是的,你可以。动态分配内存(在堆上)的 范围 和生存期不限于函数范围。它在free()d 之前一直有效。
注意:始终检查 malloc() 和 do not cast 的返回值是否成功。
2.以及如何释放cp?
使用完内存后,您可以从main() 或任何其他函数调用free(<pointer>);,其中<pointer> 是您收集allocate() 返回值的变量。
【讨论】: