【问题标题】:What happens to the malloc'ed memory when exit(1) is encountered?当遇到 exit(1) 时,malloc 的内存会发生什么?
【发布时间】: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


    【解决方案1】:

    一旦你调用exit,操作系统就会收回所有分配的内存。所以不用打free

    编辑: 但是通常最好的做法是释放您在程序中分配的内存,因为您将来修改它时可能会忽略对 free 的调用。

    【讨论】:

    • 无需致电free() 是一个非常糟糕的建议。绝对不应鼓励。
    • @Als 问题是:do I have to manually do this just before the exit... 所以在这里调用exit 之前调用free 肯定是没有必要的。
    • 答案应该反映良好的编程实践,而不是鼓励不良实践,它可能会在 OP 或不了解该语言的新人的脑海中产生错误印象,只是通过 advice,所以建议最好是完整的。阅读这个答案有人可能会得出结论,他们甚至不需要在程序退出时释放其他资源,这绝对不是真的。你应该了解你的含义做出这样的陈述时回答,除非你更新你的答案以反映这一点,否则你有我的 -1。
    • @Als:我不同意。在 exit 之前可能几天或几周没有触及的结构上递归调用 free 是非常有害的。它破坏交换,从物理内存中驱逐大量实际有用的数据/缓存,并且除了让 valgrind 高兴之外,什么都不做。为什么您认为 Firefox 在您单击关闭按钮后需要 20 多秒才能消失?
    • 这是“最佳实践”,就像避免 goto 是“最佳实践”一样——这是一个不灵活且过于简化的规则,无法解决核心问题。正确表述的规则应该是“最小化动态分配内存的生命周期”。在这种形式中,请注意在exit 之前调用free 对生命周期没有影响。此外,例如,如果您在启动时分配了一块内存并且从未再次使用它,那么在exit 之前对其调用free 并不能解决问题。相反,您应该在完成后立即致电free
    【解决方案2】:

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

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

    【讨论】:

    • 是的,严格来说这是“不必要的”。但谁知道呢。当我这样做时,我什至感觉很糟糕。 :D
    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 2015-09-14
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2017-05-26
    • 2012-05-28
    相关资源
    最近更新 更多