【问题标题】:dynamically allocated memory after program termination程序终止后动态分配的内存
【发布时间】:2011-10-07 07:54:21
【问题描述】:

当包含动态分配内存(使用 malloc/new)而没有释放/删除调用的 C/C++ 程序终止时,动态分配的内存会发生什么情况? 操作系统会收回内存还是其他程序无法访问该内存?

【问题讨论】:

  • 这称为内存泄漏。所以是的,内存对其他程序不可用。
  • @Sani:它称为内存泄漏,不,实际上,进程结束后内存不会保持不可用。
  • 这个问题需要回答多少次?

标签: c++ c memory-management memory-leaks malloc


【解决方案1】:

我不认为语言标准有任何保证,但支持稀疏虚拟内存和内存保护的现代操作系统(例如 MacOS X、Linux、所有最新版本的 Windows 以及所有当前制造的手机) 在表现不佳的进程(当它们终止时)后自动清理并为您释放内存。但是,只要程序正在运行,内存仍然不可用。

如果您在微控制器、MacOS 9 或更早版本、DOS 或 Windows 3.x 上进行编程,那么您可能需要担心内存泄漏会导致整个操作系统永久无法使用内存。

【讨论】:

    【解决方案2】:

    C/C++ 没有垃圾回收功能。如果您分配了内存并且没有释放它,那么在程序继续执行时它是没有用的。这称为内存泄漏。执行完成后,操作系统会收回此内存并再次可供使用。

    【讨论】:

      【解决方案3】:

      大多数现代操作系统都使用内存管理器,所有用户级进程只能看到所谓的虚拟内存,它与实际系统内存无关,程序可以检查。这意味着程序不能简单地读取另一个进程的内存或内核内存。这也意味着内存管理器将在进程终止时完全“释放”已分配给进程的所有内存,因此程序中的内存泄漏通常不会“影响”系统的其余部分(除了可能强制大量的磁盘交换,可能还有一些“内存不足”的行为)。

      这并不意味着可以轻松地处理内存泄漏,它只是意味着没有一个程序可以随意破坏现代多任务操作系统上的其他进程(尽管故意滥用管理权限,当然)。

      【讨论】:

        【解决方案4】:

        在程序执行期间,你不能指望操作回收内存。这将是许多其他语言(例如 Java 和 C#)中的垃圾收集功能。虽然垃圾收集 c++ 是可能的,但我不相信任何主流实现都使用它。

        另一方面,一旦您的程序完成执行,操作系统应该回收程序使用的内存。所以在执行期间内存仍然是禁区,但在程序退出后可以再次访问。

        【讨论】:

          【解决方案5】:

          简短回答:是的,操作系统将释放此内存。

          大多数操作系统都会释放此内存,但依赖此行为是不好的做法。某些操作系统不会释放此内存。例如,嵌入式系统。为了便携性,请始终释放您分配的所有内存。

          【讨论】:

          • 通常只有执行完成后
          • 旧版操作系统是否也有空闲内存?
          • @dragonwrenn:旧版操作系统(如果有的话)不会释放内存。任何现代系统都应该发布它。
          • 现代操作系统(在本世纪及之前编写的)将在您的混乱之后清理。你的烂摊子在一个虚拟空间中,当你的程序结束时它就会消失。嵌入式系统是另一回事。许多人几乎没有可以称为操作系统的东西。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-12
          • 1970-01-01
          • 2014-04-14
          • 2012-04-28
          • 1970-01-01
          • 2013-04-14
          相关资源
          最近更新 更多