假设我将一些内存分配到一些指针中,但在程序退出之前不释放它们。此内存是否会在退出时自动释放,或者内存泄漏是否会继续存在,直到我重新启动计算机?
6 回答
答案是,大多数时候。
释放堆是操作系统的责任。虽然大多数操作系统(尤其是主流操作系统)在退出时都会释放堆,但对于嵌入式系统操作系统来说并不一定如此。
当您要求在堆上分配内存时,会对操作系统的内核空间进行系统调用以提供此内存。此内存映射到由操作系统维护的进程结构。当您的程序退出时,操作系统会进行清理路由,关闭所有文件描述符,并将此内存标记为空闲以分配给其他进程(除其他外)。
其中一些答案说它依赖于编译器是不正确的。编译器不会说“嘿,在程序退出时释放所有这些内存”。那没有意义,如果操作系统意外终止程序会发生什么?不,编译器负责在显式请求堆的内存分配/释放时生成系统调用。
内存不会被您的程序或 libc 释放,但会被所有现代操作系统上的操作系统释放。它们将内存分配给特定进程,并在进程终止时清理内存。
任何现代桌面操作系统都会在进程退出时回收资源。不会有内存泄漏。
这取决于您使用的操作系统。显然,任何现代桌面操作系统都设计为在程序退出时在您之后清除(如有必要)。
如果您查看 C 标准,它是特定于实现的,因此您无法确定。
但是大多数操作系统会在进程终止后释放内存,但在某些更小/更简单的平台上可能并非如此。
那不是交流问题。堆的实现方式取决于编译器以及程序退出后操作系统的作用。据我所知,当程序退出时,所有现代操作系统都会释放内存资源。在某些嵌入式系统或驱动程序上可能不是这样。