C语言返回值内存分配:父函数需释放子函数分配的内存吗?
问题解答:子函数malloc分配的内存,父函数需要释放吗?
当然需要!这是C语言里必须牢记的规则——C没有自动垃圾回收机制,通过malloc()在堆上分配的内存,会一直占用系统资源,直到你显式调用free()来释放它。
咱们来看你给出的示例代码:
char * myFunc() { return malloc(5); // free() not called } int main() { char * str = myFunc(); // does str need to be freed? return 0; }
这里myFunc的作用是分配内存并把指向该内存的指针返回给调用者,相当于把这块内存的所有权转交给了main函数。如果main里不调用free(str),这5字节的内存就会变成内存泄漏——程序运行期间它会一直占着堆空间,要是这类分配操作被多次调用,泄漏的内存会越来越多,最终可能导致程序崩溃或者系统资源耗尽。
给你修正后的正确代码示例:
char * myFunc() { return malloc(5); } int main() { char * str = myFunc(); // 这里可以对str进行读写操作 free(str); // 必须调用free释放内存,避免泄漏 str = NULL; // 可选但建议做,防止后续误操作野指针 return 0; }
补充几个核心要点:
- 不是绝对的“谁分配谁释放”,而是谁持有内存的所有权,谁负责释放。子函数把指针返回给父函数,就是把所有权移交了,父函数必须接手释放工作。
- 如果子函数分配内存后不返回指针,那就要自己在函数内部调用
free()释放;但只要把指针返回给了调用者,释放的责任就转移了。 - 短程序里的小内存泄漏可能看不出影响,但长期运行的服务、嵌入式程序中,内存泄漏是致命的问题,必须严格避免。
内容的提问来源于stack exchange,提问作者bli00
相关产品推荐
相关产品推荐

