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

Use*_*482 1 c++ memory-leaks

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

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

Dav*_*rtz 5

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

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

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

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

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

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

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

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

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

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

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

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

  • 感谢@David 的详细回答。欣赏它!不知道为什么一个真正的问题会被否决,尽管如此,我今天学到了一些新东西。 (2认同)