程序退出时是否释放了泄漏的内存?


Answers:


151

是的,“内存泄漏”只是进程不再引用的内存,因此不再可以释放。操作系统仍会跟踪分配给进程的所有内存,并在该进程终止时释放它。

在大多数情况下,操作系统会释放内存,就像在Windows,Linux,Solaris等Windows的常规“风格”中一样。但是要注意的是,在诸如各种实时操作系统之类的特殊环境中,操作系统会释放内存。程序终止时,内存可能无法释放。


4
问题:操作系统是否跟踪所有分配?您分配的任何堆内存都来自进程的虚拟内存空间-进程终止时,该空间将分配给系统批发,对吗?我不明白为什么需要额外的簿记,因为进行分配的过程是(在用户领域中)唯一可以访问这些页面的过程。还是我教错了?
克里斯·汤金森

6
@Justin:在不知道操作系统的情况下,我认为这是无效的。也许明确指定您正在谈论的操作系统。
Brian R. Bondy 2010年

1
注意:标准对此没有说明。也不能保证。这是它在大多数(如果不是全部)现代OS上都能运行的方式,但是它们并不是必须的,并且在过去,有些操作系统既常见又没有进行此清理。
Edward Strange 2010年

5
小型设备等各种实时OS不能回收泄漏中丢失的内存。您的问题取决于您所讨论的操作系统。
Brian Neal 2010年

14
即使使用特定的受内存保护的操作系统,您仍然需要定义“泄漏”。应用程序很有可能在自己的内存空间之外分配“系统”资源(在Windows世界中通常使用句柄来标识这些资源)。关闭应用程序并不能始终确保释放这些类型的资源。
戴维

34

执行您的程序的OS通常会清理未显式释放的内存并处理未显式关闭的内存,但是C ++标准不能保证这一点。您可能会发现某些嵌入式设备无法释放内存泄漏。

话虽这么说,Windows和我所见过的所有Linux发行版都可以释放内存泄漏。

您可以轻松地创建一个巨大的内存泄漏循环,尽管可以自己进行测试。观察您的RAM使用率增长,然后关闭程序。您将看到RAM使用率下降。


使用C ++时的另一个注意事项是,如果不删除堆分配的内存,则也不会调用析构函数。有时,如果不调用析构函数,也会产生其他副作用。


14

您是否在台式机操作系统(Windows,Linux等)上运行?如果是这样,是的,通常,系统会在程序退出时释放与该程序关联的所有内存。


10

通常是的。有些系统支持诸如共享内存块之类的东西,但是当程序退出时它们不会自动释放。多数仍然保留一个引用计数,并在所有打开它的程序退出时将其删除,但有一些则没有(例如,即使没有任何引用,16位Windows也会保留一些类型的项目,尽管它通常由于其他原因而崩溃,直到这些累积的足够多导致出现问题...)


5

据我所知,现代的操作系统将在程序终止后释放此内存。


4

取决于您泄漏的内存。操作系统无法回收某些内存。但是,当进程退出时,大多数操作系统上的大多数内存将自动回收。


6
OS无法回收某些内存-例如什么?

2
在某些实时操作系统上,我已经看到特殊的以太网缓冲区,这些缓冲区在进程退出时不会被清除。
Brian Neal 2010年

1
通常也不会回收共享内存,因为您可能希望持久保留共享内存以供临时进程使用。
Brian Neal 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.