Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当程序退出时,堆是否被释放?_C - Fatal编程技术网

C 当程序退出时,堆是否被释放?

C 当程序退出时,堆是否被释放?,c,C,假设我将一些内存malloc到一些指针中,但在程序退出之前不释放它们。该内存是否会在退出时自动释放,或者在我重新启动计算机之前内存泄漏是否会继续存在?任何现代桌面操作系统都会在进程退出时回收资源。不会出现内存泄漏。程序或libc不会释放内存,但所有现代操作系统上的操作系统都会释放内存。它们将内存分配给特定进程,并在进程终止时清理内存。这取决于您使用的操作系统。显然,任何现代桌面操作系统都是为了在程序退出后清除而设计的,如果有必要的话。如果你看一下C标准,它是特定于实现的,所以你不能确定这一点 但

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

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

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

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

如果你看一下C标准,它是特定于实现的,所以你不能确定这一点


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

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

答案通常是

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

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


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

程序退出后如何释放堆与编译器无关。这是一个操作系统的问题。是的,这就是我想说的。但不太好。编译器对如何实现堆有一定的发言权。你可以在没有虚拟地址空间或内存管理的操作系统上安装C程序。在所有现代植入中,编译器都会将调用转发给系统调用,但这不一定是经过的情况。并非所有操作系统都能做到这一点。感谢@75英寸钢琴家,给出了如此出色和清晰的解释。