应用程序内存泄漏是否会导致操作系统内存泄漏?

Bar*_*uch 27 operating-system memory-leaks

当我们说一个程序泄漏内存,说没有删除在C++中,它真的泄漏?我的意思是,当程序结束时,是否仍然将内存分配给某些非运行程序并且无法使用,或者操作系统是否知道每个程序请求的内存,并在程序结束时释放它?如果我多次运行该程序,我会耗尽内存吗?

asc*_*ler 36

不,在所有实际操作系统中,当程序退出时,操作系统将回收其所有资源.内存泄漏在可能会持续运行较长时间的程序和/或可能经常从同一程序调用的函数中成为一个更严重的问题.


Tee*_*kin 19

在具有受保护内存的操作系统(Mac OS 10+,所有Unix克隆,如Linux和基于NT的Windows系统,意味着Windows 2000及更低版本)上,内存在程序结束时释放.

如果你经常运行任何程序而不在它们之间关闭它(同时运行越来越多的实例),你最终会耗尽内存,无论是否存在内存泄漏,所以对于程序来说也是如此内存泄漏.显然,泄漏内存的程序将比没有内存泄漏的相同程序更快地填充内存,但是在不填充内存的情况下运行它的次数更多地取决于程序正常运行所需的内存量,而不是内存泄漏或不.除非你要比较两个完全相同的程序,一个是内存泄漏,另一个是没有内存,所以这种比较真的没什么价值.

当程序运行很长时间时,内存泄漏变得最严重.典型的例子是服务器软件,例如Web服务器.例如,对于游戏或电子表格程序或文字处理程序,内存泄漏并不是那么严重,因为最终会关闭这些程序,从而释放内存.但当然,记忆泄漏是令人讨厌的小动物,应该始终作为原则解决.

但如前所述,所有现代操作系统在程序关闭时释放内存,因此即使内存泄漏,如果您不断打开和关闭程序,也不会填满内存.

  • 我知道这已经晚了,但为了澄清,我的问题是我是否多次运行程序*在运行下一个实例之前关闭每个实例*,而不是同时运行. (3认同)
  • 我认为重点是所有程序*都使用*内存,有些程序比其他程序更有效.一些技术上不泄漏的程序仍然非常低效地使用内存(保持分配的时间远远超过它们所需的时间,即使它最终被释放). (2认同)

Too*_*the 14

执行停止后,OS会返回泄漏的内存.

这就是为什么它并不总是桌面应用程序的大问题,但它是服务器和服务的一个大问题(它们往往运行很长时间.).

让我们看看以下场景:

  1. 程序A从操作系统询问内存
  2. OS将块X标记为A已使用并将其返回给程序.
  3. 程序应该有一个指向X的指针.
  4. 程序返回内存.
  5. 操作系统将块标记为空闲.现在使用该块会导致访问冲突.
  6. 程序A结束,A使用的所有内存都标记为未使用.

没有错.

但是如果内存是在循环中分配的并且忘记了删除,那么你会遇到真正的问题:

  1. 程序A从操作系统询问内存
  2. OS将块X标记为A已使用并将其返回给程序.
  3. 程序应该有一个指向X的指针.
  4. 转到1

如果操作系统内存不足,程序可能会崩溃.


Fem*_*ref 5

当进程结束时,内存也会被清除。问题在于,如果程序泄漏内存,它将请求越来越多的操作系统运行,并可能使操作系统崩溃。


nmi*_*els 5

不会.一旦操作系统完成关闭程序,内存就会恢复(给定一个相当现代的操作系统).问题在于长时间运行的流程.