C语言函数内使用malloc()后是否必须调用free()?不释放会内存泄漏吗?
问题解答
核心结论
- 调用
malloc申请内存后,不需要必须在同一个函数内调用free释放。 - 仅在函数内调用
malloc不主动释放,也不一定会造成内存泄漏。
具体解释
内存泄漏的判定标准是:进程运行期间,某块堆内存已经不再被程序需要,但没有被主动释放,且不存在任何指向这块内存的有效指针,导致后续永远无法释放这块内存。和malloc、free是否在同一个函数内没有直接关系。
你给出的链表头插函数是完全符合规范的写法:你malloc申请的节点指针,最终赋值给了作用域更大的head变量,后续你可以通过head遍历到这个节点,完全可以在链表使用完毕后统一释放所有节点,当下不在insertFirst函数内释放是动态数据结构的常规实现逻辑,不会直接导致内存泄漏。
反例说明
只有当你在函数内申请的内存,既没有把指针返回给调用方,也没有存入全局/静态变量留待后续使用,函数执行结束后指针直接丢失,没有任何途径可以再释放这块内存时,才会造成内存泄漏,示例如下:
void bad_demo() { int *buf = malloc(1024); // 没有返回buf,也没有把buf存入其他长期生效的变量 // 函数执行结束后buf变量销毁,申请的1024字节内存就再也无法释放,发生泄漏 }
注意事项
你当前的头插实现没有问题,只需要注意在整个链表不再使用时,遍历所有节点逐一调用free释放即可,避免整体链表的内存泄漏。
内容的提问来源于stack exchange,提问作者user16438868
相关产品推荐
相关产品推荐

