程序退出时是否释放堆?

时间:2013-04-08 15:03:20

标签: c

假设我将一些内存安装到一些指针中,但在程序退出之前不要释放它们。这个内存在退出时会自动释放,还是内存泄漏会继续存在,直到我重新启动计算机?

6 个答案:

答案 0 :(得分:6)

答案是,最常见的。

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

这取决于您使用的操作系统。显然,任何现代桌面操作系统都是为了在你的程序退出后清除,如果有必要的话。

答案 4 :(得分:1)

如果你看一下C标准,它是特定的实现,所以你无法确定。

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

答案 5 :(得分:1)

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