Windows 7 清理 C++ 内存泄漏?

Posted

技术标签:

【中文标题】Windows 7 清理 C++ 内存泄漏?【英文标题】:Windows 7 cleans up C++ memory leaks? 【发布时间】:2012-04-16 17:42:29 【问题描述】:

只是为了好玩,我创建了一个项目,该项目创建了大约 5 GB 的内存并且没有删除它。只要应用程序正在运行,“内存泄漏”就在那里。在我关闭应用程序的那一刻,内存在 2 秒内恢复正常,就好像我的程序从未运行过一样。所以必须提出问题。

Windows 7 是否会在不良程序完成后清理内存泄漏?

所有 Windows 版本都这样做吗?

Linux 和 Mac OS X 环境会这样做吗?

【问题讨论】:

Is there a reason to call delete in C++ when a program is exiting anyway? 的可能重复项 【参考方案1】:

一旦您的应用程序在其中运行的进程退出,操作系统就会回收分配给该进程的所有内存。

这通常适用于所有操作系统,而不仅仅是 Windows 7 或 Windows。

请注意,您可能会观察到 other 泄漏资源(如文件句柄等)的不同行为,通常操作系统不会回收这些资源。因此,通常(是的,也有例外)是一种很好的做法,可以让您自己的应用程序清除它所造成的混乱(释放分配的资源),而不是将其委托给操作系统。

【讨论】:

我正在检查一些来自 MS 的文档,但找不到任何说明其内存管理规则的文档。 @Rohit:这是任何操作系统的基础。如果内存泄漏的应用程序/进程被允许永远泄漏内存,操作系统将不得不定期重启,事实上它不必是对事实的证明。 我同意这一点,但仍然应该有一些东西。我想我应该参考我毕业时的操作系统教科书来找到一些东西。 唯一可能(应该)在程序退出时泄漏的资源是有些深奥的东西,例如共享内存段(通常,它们旨在超越创建它们的程序)。该类别中的项目并不多。文件描述符之类的东西应该在所有讨论过的系统上发布。 @Rohit:没有明确说明。它来自“一个进程有一个虚拟地址空间”。分配是在这个虚拟地址空间中完成的,而不是在物理 RAM 中。这个虚拟地址空间属于进程,因此随之消亡,这意味着所有分配也都消失了。【参考方案2】:
    是(Windows 7 确实会在程序退出时回收分配给程序的所有内存,无论它以何种方式退出 - 受控或崩溃时)。 是(适用于任何最新的 Windows 版本,但仍可运行)。 是(Unix、Linux、Mac OS X、BSD 都会在程序退出时回收分配给程序的所有内存,无论它如何退出)。

一些旧操作系统在程序退出时没有重新获取资源。我相信 AmigaOS 就是其中之一。我相信另一个是旧的 Mac OS(Mac OS 9 及更早版本)。然而,当分配给它的进程退出时,几乎所有真正的多任务系统都必须回收内存(以及一般的资源)。

【讨论】:

【参考方案3】:

程序不仅管理内存,还管理操作系统。它会在程序存在后回收分配给程序的所有内存。它不会干扰程序的执行(分页和交换除外)。这种对操作系统内存的控制有助于操作系统避免因内存泄漏而崩溃。

内存管理是管理计算机内存的行为。这 内存管理的基本要求是提供方法 根据程序的请求动态分配部分内存, 并在不再需要时释放它以供重用。这对 计算机系统。

BSD Unix 通常在空闲内存百分比低于 5% 时开始回收内存,并继续回收直到空闲内存百分比达到 7%

【讨论】:

【参考方案4】:

当程序终止时,操作系统会回收之前分配给它的所有内存。清理内存泄漏可能是由此产生的副产品,但操作系统实际上并不这么认为。它不知道程序一直在泄漏内存,只知道它已经分配了它。

【讨论】:

+1 这就是实际发生的情况。操作系统不知道进程泄漏了内存,它不必知道。它只是收回它给出的内容。【参考方案5】:

并非所有操作系统都如此,例如,我不相信 WinXP 会这样。

尽管对于大多数现代操作系统来说,现在都是如此。我相信所有当前版本的 Linux、Windows 和 MacOS 都可以做到这一点。

对于 Windows,我很确定它是在 Windows Vista 中引入的。当时这是一个相当令人兴奋的改进,因为那里有很多无法很好地管理内存的狡猾的 Windows 应用程序。在当时,这对 Windows 来说是一个巨大的胜利,但它来晚了(像往常一样),因为 Linux 和 MacOS 很久以前就已经这样做了。

话虽如此,我相信您肯定仍然需要在应用程序中正确管理内存,而不是简单地依赖操作系统来清理。应用程序在运行时也需要高效且可预测地使用内存。

【讨论】:

我同意 Vista 中的内存管理有很大改进,7 中也是如此。但这并不意味着 XP 不会收回所有分配的内存。 XP中总是有虚拟机 它实际上可以追溯到 NT 3.1。 Win95 是另一回事,但那条代码线在 2 年前就随着 WinME 消失了。 自 1993 年以来的所有 Windows NT 版本(包括 XP)都具有基于进程的虚拟内存; Vista 引入了各种保护和性能改进,但没有改变底层内存模型。您可能会想到基于 DOS 的 Windows 版本(例如 95、98 和 ME),它们的内存管理相当差。值得庆幸的是,它们现在已成为古老的历史。 不幸的是,不依赖操作系统清理变得越来越困难。防止当前被阻止的线程发出信号并尝试访问已释放的内存对于用户代码来说非常困难,但对于操作系统来说却很容易。停止在不同 CPU 内核上运行的线程,而不是希望清理正在使用的内存的线程对于用户代码来说非常困难,但对于操作系统来说却很容易。在许多设计中,“依靠你的操作系统来清理”是一个可行的选择,而“手动”清理的替代方案变得越来越困难。开始习惯这个想法。

以上是关于Windows 7 清理 C++ 内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript的内存泄漏分析

在 Visual C++ (Windows) 中检测内存泄漏

内存泄漏与垃圾回收机制

分析 ThreadLocal 内存泄漏问题

Unity - Android, C# - C++ 内存泄漏

内存泄漏和内存溢出的区别