Memory leaks 应用程序内存泄漏是否会导致操作系统内存泄漏? 当我们说程序泄漏内存时,比如说,在C++中没有 >删除< /强>,它真的泄漏了吗?我的意思是,当程序结束时,内存是否仍分配给某个未运行的程序而无法使用,或者操作系统是否知道每个程序请求了什么内存,并在程序结束时释放它?如果我多次运行该程序,是否会耗尽内存?

Memory leaks 应用程序内存泄漏是否会导致操作系统内存泄漏? 当我们说程序泄漏内存时,比如说,在C++中没有 >删除< /强>,它真的泄漏了吗?我的意思是,当程序结束时,内存是否仍分配给某个未运行的程序而无法使用,或者操作系统是否知道每个程序请求了什么内存,并在程序结束时释放它?如果我多次运行该程序,是否会耗尽内存?,memory-leaks,operating-system,Memory Leaks,Operating System,当进程结束时,内存也会被清除。问题是,如果一个程序泄漏内存,它将请求越来越多的操作系统运行,并可能使操作系统崩溃。泄漏的内存在执行停止后由操作系统返回 这就是为什么桌面应用程序并不总是一个大问题,但服务器和服务(它们往往运行很长时间)却是一个大问题 让我们看看以下场景: 从操作系统编程ask内存 操作系统将块X标记为已被A使用,并将其返回给程序 程序应该有一个指向X的指针 程序返回内存 操作系统将该块标记为空闲。现在使用块会导致访问冲突 程序A结束,A使用的所有内存都标记为未使用 这没什么错 但

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

泄漏的内存在执行停止后由操作系统返回

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

让我们看看以下场景:

  • 从操作系统编程ask内存
  • 操作系统将块X标记为已被A使用,并将其返回给程序
  • 程序应该有一个指向X的指针
  • 程序返回内存
  • 操作系统将该块标记为空闲。现在使用块会导致访问冲突
  • 程序A结束,A使用的所有内存都标记为未使用
  • 这没什么错

    但是,如果在循环中分配内存,并且忘记了删除,则会遇到实际问题:

  • 从操作系统编程ask内存
  • 操作系统将块X标记为已被A使用,并将其返回给程序
  • 程序应该有一个指向X的指针
  • 转到1

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

    否。一旦操作系统关闭程序,内存就会恢复(如果操作系统相当现代化)。问题在于长时间运行的进程。

    在代码本身不再控制内存的意义上,它更容易泄漏。

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

    程序结束时,操作系统可以释放内存。如果程序中存在泄漏,那么它只是程序运行时的一个问题。对于长时间运行的程序(如服务器进程),这是一个问题。或者,例如,如果您的web浏览器出现内存泄漏,并且您让它运行了几天,那么它将逐渐消耗更多内存。

    据我所知,在大多数操作系统上,当程序启动时,它会收到一个定义的内存段,一旦程序结束,该内存段将被完全释放


    内存泄漏是发明垃圾收集器算法的主要原因之一,因为一旦插入运行时,它们就负责回收程序无法再访问的内存。

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

    如果您运行任何程序的频率足够高,而没有在中间关闭它(同时运行越来越多的实例),不管是否存在内存泄漏,最终都会耗尽内存,因此存在内存泄漏的程序也是如此。显然,存在内存泄漏的程序会比没有内存泄漏的相同程序更快地填满内存,但在不填充内存的情况下运行它的次数在很大程度上取决于占用内存的多少程序正常运行所需的内存比是否存在内存泄漏更重要。除非您比较两个完全相同的程序,一个有内存泄漏,另一个没有内存泄漏,否则这种比较实际上毫无价值

    当一个程序运行很长时间时,内存泄漏会变得最严重。典型的例子是服务器软件,如web服务器。例如,对于游戏、电子表格程序或文字处理器,内存泄漏几乎没有那么严重,因为你最终关闭了这些程序,释放了内存。但当然内存泄漏是一个令人讨厌的小问题,应该作为一个原则问题来解决


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

    内存泄漏不会持续到执行结束后,因此“解决方案”对于任何内存泄漏来说,都是简单地结束程序执行。显然,对于某些类型的软件来说,这是一个更大的问题。由于内存泄漏,数据库服务器需要每8小时脱机一次,这比连续玩8小时后需要重新启动的视频游戏更大

    术语“泄漏”是指随着时间的推移,内存消耗会增加,而不会带来任何好处。“泄漏”内存是指程序既不使用也不可供操作系统(和其他程序)使用的内存


    遗憾的是,内存泄漏在非托管代码中非常常见。我已经使用Firefox几天了,尽管只有4个标签打开了,但是内存使用量是424MB。如果关闭Firefox并重新打开相同的标签,内存使用可能会重复我正在学习的C++,而且恐怕每次运行程序时,我都使用更多的MEM。ory(我仍在学习我的内存管理技能)也是“它的所有资源”-对于一些由操作系统为进程分配的持久性对象,如SysV IPC描述符(也有一些shm对象),情况并非如此,和一些widows处理程序。那么,当出现新的/malloc时,总是删除/释放是更好的做法吗?好奇的是:为什么所有程序都会泄漏内存?你是说这是von Neumann体系结构的一个基本特征,还是说所有程序都不可避免地会丢失内存