【问题标题】:Does the heap get freed when the program exits? [duplicate]程序退出时是否释放堆? [复制]
【发布时间】:2013-03-30 17:41:56
【问题描述】:

假设我将一些内存分配到一些指针中,但在程序退出之前不释放它们。退出时是否会自动释放此内存,或者内存泄漏是否会继续存在,直到我重新启动计算机?

【问题讨论】:

标签: c


【解决方案1】:

答案是,最常见的。

释放堆是操作系统的责任。虽然大多数操作系统(尤其是主流操作系统)在退出时都会释放堆,但对于嵌入式系统操作系统来说,这并不一定如此。

当您要求在堆上分配内存时,系统调用操作系统的内核空间来提供此内存。此内存映射到由操作系统维护的进程结构。当您的程序退出时,操作系统会执行清理路由,关闭所有文件描述符,并将此内存标记为空闲以分配给其他进程(以及其他内容)。

其中一些答案说它依赖于编译器是不正确的。编译器不会说“嘿,在程序退出时释放所有这些内存”。那没有意义,如果操作系统意外终止程序会发生什么?不,编译器负责生成系统调用,每当显式请求堆内存分配/释放时。

【讨论】:

  • 感谢@75inchpianist 的精彩和清晰的解释。
【解决方案2】:

内存不会被您的程序或 libc 释放,但会被所有现代操作系统上的操作系统释放。它们将内存分配给特定进程,并在进程终止时清理内存。

【讨论】:

  • 并非所有操作系统都会这样做。
【解决方案3】:

任何现代桌面操作系统都会在进程退出时回收资源。不会有内存泄漏。

【讨论】:

    【解决方案4】:

    这取决于您使用的操作系统。显然,任何现代桌面操作系统都设计为在您的程序退出时在必要时在您之后清除。

    【讨论】:

      【解决方案5】:

      如果您查看 C 标准,它是特定于实现的,因此您无法确定。

      但大多数操作系统会在进程终止后释放内存,但在一些更小/更简单的平台上可能并非如此。

      【讨论】:

        【解决方案6】:

        这不是一个 c 问题。堆的实现方式取决于编译器以及程序退出后操作系统的作用。据我所知,当程序退出时,所有现代操作系统都会释放内存资源。在某些嵌入式系统或驱动程序上可能不是这样。

        【讨论】:

        • 程序退出后如何释放堆与编译器无关。这是一个操作系统问题。
        • 是的,这就是我想说的。但不好。编译器对如何实现堆有一些发言权。您可以在没有虚拟地址空间或内存管理的操作系统上使用 C 程序。在所有现代植入中,编译器都会将调用转发给系统调用,但不一定是这种情况
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-26
        • 2019-03-09
        • 2014-08-29
        • 1970-01-01
        相关资源
        最近更新 更多