当遇到exit(1)时,使用malloc分配的内存会发生什么?

5

在C语言中,如果我使用malloc分配了一段内存,在程序执行期间遇到异常或错误后,程序会通过手动加入的exit(1)语句退出,那么C编译器会在意外退出前自动释放内存,还是我必须在exit(1)语句前手动释放内存。

我在Ubuntu 32位平台上使用gcc-4.5.2编译器。

2个回答

11
一旦您调用了 exit,操作系统将收回所有分配的内存。因此不需要调用 free
编辑: 但通常最好释放程序中分配的内存,因为在将来修改时可能会忽略调用释放。

1
@Als的问题是:“我是否必须在退出之前手动执行此操作...”因此,在调用exit之前调用free在这里肯定是不必要的。 - P.P
2
答案应遵循良好的编程实践,而不是鼓励坏习惯,否则可能会在提问者或对该语言不熟悉并只依赖“建议”的新手心中产生错误印象。因此,建议最好是完整的。通过阅读本答案,有人可能会得出一个结论,即他们甚至不需要在程序退出时释放其他资源,这绝对是不正确的。当你发表这样的声明时,你应该理解回答的影响,除非你更新回答以反映这一点,否则我会给你负一分。 - Alok Save
1
@Als:我不同意。在你exit之前对可能已经有数天或数周没有被触及的结构体进行递归调用free是极其有害的。它会导致交换空间崩溃,从物理内存中驱逐大量实际有用的数据/缓存,并且除了让valgrind感到高兴之外,什么也没有做到。你为什么认为Firefox在你单击关闭按钮后需要20多秒才能消失? - R.. GitHub STOP HELPING ICE
@R..:我不知道你对什么持反对意见,“最佳实践”吗?我认为我在评论中已经表达了我的反对意见。我没有更多要说的了。 - Alok Save
2
这就跟避免使用goto语句一样,"最佳实践"是一个不灵活而过于简化的规则,无法解决核心问题。正确表述的规则应该是“尽量减少动态分配内存的生命周期”。采用这种形式,注意在exit之前调用free不会对其生命周期产生影响。此外,如果例如在启动时分配了一块内存,并且从未再次使用它,则在exit之前对其调用free并不能解决问题。相反,您应该在完成使用后立即调用free - R.. GitHub STOP HELPING ICE
显示剩余4条评论

6
在设计良好的操作系统上,当一个进程退出(使用exit()、die()、abort()或raise(),或者被错误、信号或其他方式杀死)时,操作系统应该释放进程使用的所有资源,包括栈空间、堆、分配的内存(通常在堆上)、关闭打开的文件描述符(如果是*NIX系统)等。
然而,我不会选择“不需要调用free()”。如果你没有明确地free()你malloc()的内存,这是一个糟糕的编程/设计概念,尽管你最终可以依靠操作系统来为你做这个事情,但当你稍后修改项目以不退出但却忘记free()所使用的内存时,可能会导致内存泄漏。

2
是的,严格来说这是“不必要的”。但谁知道呢。我甚至在这样做时感到有点不好意思。:D - user529758

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接