117 如果我在不知不觉中进行了编程,那么就会发生内存泄漏,并且应用程序终止了,是否可以释放泄漏的内存? c++ memory-leaks — 马丁·考特 source 非常非常有用的,相关的答案:unix.stackexchange.com/questions/275184/... — 加布里埃尔斯台普斯
151 是的,“内存泄漏”只是进程不再引用的内存,因此不再可以释放。操作系统仍会跟踪分配给进程的所有内存,并在该进程终止时释放它。 在大多数情况下,操作系统会释放内存,就像在Windows,Linux,Solaris等Windows的常规“风格”中一样。但是要注意的是,在诸如各种实时操作系统之类的特殊环境中,操作系统会释放内存。程序终止时,内存可能无法释放。 — 贾斯汀·埃斯蒂尔 source 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 ++时的另一个注意事项是,如果不删除堆分配的内存,则也不会调用析构函数。有时,如果不调用析构函数,也会产生其他副作用。 — 布莱恩·邦迪 source
10 通常是的。有些系统支持诸如共享内存块之类的东西,但是当程序退出时它们不会自动释放。多数仍然保留一个引用计数,并在所有打开它的程序退出时将其删除,但有一些则没有(例如,即使没有任何引用,16位Windows也会保留一些类型的项目,尽管它通常由于其他原因而崩溃,直到这些累积的足够多导致出现问题...) — 杰里·科芬 source
4 取决于您泄漏的内存。操作系统无法回收某些内存。但是,当进程退出时,大多数操作系统上的大多数内存将自动回收。 — 小狗 source 6 OS无法回收某些内存-例如什么? 2 在某些实时操作系统上,我已经看到特殊的以太网缓冲区,这些缓冲区在进程退出时不会被清除。 — Brian Neal 2010年 1 通常也不会回收共享内存,因为您可能希望持久保留共享内存以供临时进程使用。 — Brian Neal 2010年