如果操作系统未清除内存泄漏,则在程序完成后内存泄漏是否仍然存在?

Do memory leaks persist after program completion if the OS does not clear it?

本文关键字:泄漏 内存 是否 存在 操作系统 清除 如果 程序      更新时间:2023-10-16

我的问题是泄漏的内存如何标记为"正在使用"。 根据我的理解,每个程序都会获得一个连续的内存块来满足其所有内存需求(堆栈、堆、只读、程序内存(。我想一旦程序完成,所有这些都将被释放(freed = open 供新程序使用(。现在,即使程序中有内存泄漏,当程序内存块被释放时,它不会自动释放吗?

我遇到了一些关于这个问题的问题,这些问题说操作系统必须释放它,但在某些较旧的操作系统版本中,这不会发生。鉴于第一段提供的解释,我不明白为什么这会是一个问题。此外,没有人谈论"释放"实际上意味着什么/做什么。

对于现代操作系统,进程不会分配物理内存。它们分配由物理内存支持的地址空间。当进程终止时,其地址空间将不再存在。

操作系统很久以前确实允许进程分配物理内存。在这些情况下,未能释放物理内存将导致物理内存永久丢失。

我的问题是泄漏的内存如何标记为"正在使用"。根据我的理解,每个程序都会获得一个连续的内存块来满足其所有内存需求(堆栈、堆、只读、程序内存(。

是的,它获得一个连续的虚拟内存块。此虚拟内存根据需要由物理内存提供支持。

我想一旦程序完成,所有这些都将被释放(freed = open 供新程序使用(。

是的,但不是。是的,一切都被释放了。不,它不开放供新程序使用,因为一个程序不可能消耗另一个进程的虚拟内存,因为每个进程都有自己的虚拟内存空间。

现在,即使程序中有内存泄漏,当程序内存块被释放时,它不会自动释放吗?

这不重要。虚拟内存不是稀缺资源。它是否被释放并不重要。但是,重要的是,支持该虚拟内存的任何物理内存将不再支持它,因为虚拟内存不再存在。这样可以释放物理内存以用于其他目的。

我遇到了一些关于这个问题的问题,这些问题说操作系统必须释放它,但在某些较旧的操作系统版本中,这不会发生。鉴于第一段提供的解释,我不明白为什么这会是一个问题。

一些较旧的操作系统甚至没有虚拟内存支持。有些具有直接分配物理内存的内存分配功能。

此外,没有人谈论"释放"实际上意味着什么/做什么。

在新式操作系统上,当它终止时,其虚拟地址空间将不再存在。这可能会导致内存的某些物理页(实际 RAM(的引用降至零,这将导致操作系统在必要时将它们重新分配给新用途。