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

Mar*_*aux 100 c++ memory-leaks

如果我编程 - 不知道它 - 内存泄漏,并且应用程序终止,泄漏的内存是否被释放?

Jus*_*ier 127

是的,"内存泄漏"只是一个进程不再具有引用的内存,因此无法再释放.操作系统仍会跟踪分配给进程的所有内存,并在该进程终止时释放它.

在绝大多数情况下,操作系统将释放内存 - 正如Windows,Linux,Solaris等正常"风格"的情况一样.但重要的是要注意在各种实时操作系统等专用环境中程序终止时可能无法释放内存.

  • 即使使用特定的内存保护操作系统,您仍需要定义"泄漏".应用程序很可能在自己的内存空间之外分配"系统"资源(句柄通常用于在Windows世界中识别这些资源).关闭应用程序并不总能确保释放这些类型的资源. (14认同)
  • @Justin:在不了解操作系统的情况下,我认为这不是有效的.也许明确指定您正在谈论的操作系统. (6认同)
  • 对于小型设备等有各种实时操作系统,它们不会回收泄漏中丢失的内存.您的问题取决于您正在谈论的操作系统. (5认同)
  • 问题:操作系统是否跟踪所有分配?您分配的任何堆内存都来自进程的虚拟内存空间 - 当进程终止时,该空间将被返回给系统批发,对吧?我不明白为什么额外的簿记是必要的,因为进行分配的过程是唯一可以访问这些页面的过程(在用户区中).还是我被误导了? (4认同)

Bri*_*ndy 31

执行程序的操作系统通常会清除未明确释放的内存和未明确关闭的句柄,但C++标准无法保证这一点.您可能会发现一些嵌入式设备无法释放内存泄漏.

据说Windows和我见过的所有Linux发行版都可以解决内存泄漏问题.

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


使用C++时要考虑的另一个考虑因素是,如果您没有删除堆分配的内存,那么您的析构函数也不会被调用.如果没有调用析构函数,有时你也会有其他副作用.


Vic*_*cky 13

您是在桌面操作系统(Windows,Linux等)上运行吗?如果是,是的,通常系统将在程序退出时释放与程序相关的任何内存.


Jer*_*fin 9

通常,是的.某些系统支持共享内存块之类的东西,但程序退出时不会自动释放.大多数仍然保留引用计数并在所有打开它的程序退出时删除它,但有一些不会(例如,16位Windows有几种类型的项目,即使没有任何引用也会保留分配 - 尽管它经常因为其他原因而崩溃,之后积累足够的东西导致问题......)


rav*_*agw 6

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


Pup*_*ppy 5

取决于您泄漏的内存。操作系统无法回收某些内存。然而,大多数操作系统上的大部分内存会在进程退出时自动回收。

  • 操作系统无法回收某些内存 - 例如什么? (6认同)
  • 在一些实时操作系统上,我见过特殊的以太网缓冲区块,当进程退出时它们不会被清除。 (2认同)