如果操作系统没有清除程序,内存泄漏是否会在程序完成后继续存在?

时间:2019-08-15 19:56:26

标签: c++ memory-leaks

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

我一直被问到有关该操作系统必须释放它的问题,但是在某些较旧的OS版本中却没有发生。鉴于第一段中的解释,我不明白为什么这会成为问题。而且,没有人谈论“释放”实际上意味着什么/需要做什么。

1 个答案:

答案 0 :(得分:1)

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

很早以前,操作系统确实允许进程分配物理内存。在这些磁盘上,无法释放物理内存将导致物理内存永久丢失。

  

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

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

  

我想象一旦程序完成,所有这些都将被释放(释放=打开以供新程序使用)。

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

  

现在,即使我的程序内存泄漏,在释放程序内存块时,它是否也不会自动释放?

没关系。虚拟内存不是稀缺资源。释放与否无关紧要。但是,重要的是,由于虚拟内存已不存在,因此任何支持该虚拟内存的物理内存都将不再支持它。这样可以释放该物理内存以用于其他目的。

  

我一直被问到有关该操作系统必须释放它的问题,但是在某些较旧的OS版本中却没有发生。鉴于第一段中的解释,我不明白为什么这会成为问题。

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

  

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

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