You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:59:06