malloc';当遇到出口(1)时,内存是否已损坏?

malloc';当遇到出口(1)时,内存是否已损坏?,c,memory-leaks,malloc,free,exit,C,Memory Leaks,Malloc,Free,Exit,在C语言中,如果我使用malloc分配内存,并且在执行过程中,程序遇到异常/错误,并在程序中手动合并exit(1)语句退出,C编译器是否会在执行意外退出之前自动释放内存,还是必须在程序中的退出(1)行之前手动释放内存 我在Ubuntu 32位平台上使用gcc-4.5.2编译器。一旦调用exit,操作系统将收回所有分配的内存。因此,无需拨打免费电话 编辑: 但一般来说,释放程序中分配的内存是一种好的做法,因为将来修改程序时可能会忽略对释放的调用。在设计良好的操作系统上,当进程退出时(使用exit(

在C语言中,如果我使用
malloc
分配内存,并且在执行过程中,程序遇到异常/错误,并在程序中手动合并
exit(1)
语句退出,C编译器是否会在执行意外退出之前自动释放内存,还是必须在程序中的
退出(1)
行之前手动释放内存


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

一旦调用
exit
,操作系统将收回所有分配的内存。因此,无需拨打免费电话

编辑:
但一般来说,释放程序中分配的内存是一种好的做法,因为将来修改程序时可能会忽略对释放的调用。

在设计良好的操作系统上,当进程退出时(使用exit()、die()、abort()或raise(),或被错误、信号或其他任何原因终止),操作系统应该释放进程使用的所有资源,包括堆栈空间、堆、分配的内存(通常在堆上)、关闭打开的文件描述符(如果是*NIX系统)等


但是,我不会选择“无需调用free()”。如果你没有显式地释放malloc()中的()内存,这是一个糟糕的编程/设计概念,尽管你最终可以依靠操作系统来为你做这件事,但当你以后修改你的项目不退出但忘记释放()你用过的内存时,这可能会导致内存泄漏。

无需调用
free()
是一个根本不好的建议。而且绝对不应该鼓励。@Als的问题是:
我必须在退出之前手动执行此操作吗…
所以在调用
退出之前调用
免费
在这里肯定是不必要的。答案应该反映良好的编程实践,而不是鼓励不良实践,这可能会在OP的头脑中产生错误的印象,或者是一些不懂这种语言的人,他们只是听从建议,因此,建议最好是完整的。阅读此答案可能会有人得出结论,他们甚至不需要在程序退出时释放其他资源,这绝对不是真的。在做出这样的陈述时,你应该理解你的答案的含义,除非你更新你的答案以反映这一点,你有我的-1。@Als:我不同意。在您退出之前的几天或几周内可能没有接触过的结构上递归调用
free
,这是极其有害的。它重击交换,从物理ram中逐出大量实际有用的数据/缓存,除了让valgrind高兴之外,什么也做不到。为什么你认为Firefox在点击关闭按钮后需要20秒以上的时间才能消失?这是“最佳实践”,同样,避免goto也是“最佳实践”——一个僵化且过于简化的规则,无法解决核心问题。正确表述的规则应该是“最小化动态分配内存的生存期”。在此表单中,请注意,在退出之前调用
free
对生命周期没有影响。此外,例如,如果您在启动时分配了一个内存块,并且再也没有使用过它,那么在退出之前对其调用
free
并不能解决问题。相反,你应该在完成后立即拨打免费电话。是的,严格来说这是“不必要的”。但谁知道呢。我做这件事时甚至感觉很糟糕D