13

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

4

6 回答 6

15

答案是,大多数时候。

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

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

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

于 2013-04-08T15:11:44.640 回答
4

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

于 2013-04-08T15:05:48.010 回答
1

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

于 2013-04-08T15:05:09.583 回答
1

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

于 2013-04-08T15:05:59.523 回答
1

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

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

于 2013-04-08T15:06:13.117 回答
1

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

于 2013-04-08T15:06:14.367 回答