程序退出时,堆会被释放吗?

15

假设我使用指针动态分配了一些内存,但程序退出前没有释放它们。这些内存会在程序退出时自动释放,还是会出现内存泄漏直到我重新启动计算机?


1
请查看这个和这个链接,它们都与malloc和free有关。 - Suvarna Pattayil
6个回答

21
答案是,通常是这样的。
释放堆内存是操作系统的责任。虽然大多数操作系统(尤其是主流操作系统)在退出时会释放堆内存,但并不一定适用于例如嵌入式系统操作系统之类的操作系统。
当您调用请求在堆上分配内存时,会向操作系统的内核空间发出系统调用以提供这些内存。这些内存映射到由操作系统维护的进程结构。当您的程序退出时,操作系统会通过清理路由关闭所有文件描述符,并将该内存标记为空闲以供其他进程分配使用(以及其他事项)。
其中一些答案错误地称其为编译器相关。编译器不会说“嘿,在程序退出时释放所有这些内存”。那如果操作系统意外终止程序会发生什么呢?不,编译器负责在显式请求对堆进行内存分配/释放时生成系统调用。

谢谢 @75inchpianist 提供如此出色清晰的解释。 - Stanley Sathler

4

现代操作系统会为特定的进程分配内存,并在进程终止时清理内存。因此,您的程序或libc不会释放内存,但操作系统会释放内存。


1
并非所有的操作系统都能做到这一点。 - 75inchpianist

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

1
这取决于你使用的操作系统。显然,任何现代桌面操作系统都是设计成在程序退出时清除它的,如果需要的话。

1
如果你看C标准,它是实现特定的,所以你不能确定这一点。但大多数操作系统在进程终止后会释放内存,但在一些较小/简单的平台上可能不是这种情况。

1

这不是一个C语言问题。堆的实现取决于编译器和程序退出后操作系统的行为。据我所知,所有现代操作系统在程序退出时都会释放内存资源。但某些嵌入式系统或驱动程序可能不适用。


程序退出后堆内存的释放与编译器无关,这是一个操作系统问题。 - 75inchpianist
是的,那就是我想说的。但表达得不够好。编译器对堆的实现有一定的影响。你可以在没有虚拟地址空间或内存管理的操作系统上运行C程序。在所有现代实现中,编译器将调用转发到系统调用,但这并非必然情况。 - rerun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接