【发布时间】:2012-05-14 17:13:37
【问题描述】:
在 C 语言中,如果我使用 malloc 分配内存并且在执行过程中,程序遇到异常/错误并在程序中手动合并 exit(1) 语句退出,C 编译器是否会在生成之前自动释放内存意外退出还是我必须在程序中的exit(1) 行之前手动执行此操作。
我在 Ubuntu 32 位平台上使用 gcc-4.5.2 编译器。
【问题讨论】:
标签: c memory-leaks malloc free exit
在 C 语言中,如果我使用 malloc 分配内存并且在执行过程中,程序遇到异常/错误并在程序中手动合并 exit(1) 语句退出,C 编译器是否会在生成之前自动释放内存意外退出还是我必须在程序中的exit(1) 行之前手动执行此操作。
我在 Ubuntu 32 位平台上使用 gcc-4.5.2 编译器。
【问题讨论】:
标签: c memory-leaks malloc free exit
一旦你调用exit,操作系统就会收回所有分配的内存。所以不用打free。
编辑: 但是通常最好的做法是释放您在程序中分配的内存,因为您将来修改它时可能会忽略对 free 的调用。
【讨论】:
free() 是一个非常糟糕的建议。绝对不应鼓励。
do I have to manually do this just before the exit... 所以在这里调用exit 之前调用free 肯定是没有必要的。
exit 之前可能几天或几周没有触及的结构上递归调用 free 是非常有害的。它破坏交换,从物理内存中驱逐大量实际有用的数据/缓存,并且除了让 valgrind 高兴之外,什么都不做。为什么您认为 Firefox 在您单击关闭按钮后需要 20 多秒才能消失?
exit 之前调用free 对生命周期没有影响。此外,例如,如果您在启动时分配了一块内存并且从未再次使用它,那么在exit 之前对其调用free 并不能解决问题。相反,您应该在完成后立即致电free。
在设计良好的操作系统上,当进程退出(使用 exit()、die()、abort() 或 raise() 或被错误、信号或其他任何东西杀死)时,操作系统应该释放进程使用的所有资源,包括堆栈空间、堆、分配的内存(通常在堆上)、关闭打开的文件描述符(如果是*NIX系统)等。
但是,我不会选择“无需调用 free()”。如果您没有显式地释放您拥有 malloc() 的内存,这是一个糟糕的编程/设计概念,尽管您最终可以依靠操作系统为您执行此操作,但当您稍后修改您的内存时,它可能会导致内存泄漏项目不退出,但您忘记释放()您使用的内存。
【讨论】: