【问题标题】:Does a c++ program automatically free memory when it crashes?c++程序崩溃时会自动释放内存吗?
【发布时间】:2011-09-19 14:57:58
【问题描述】:

我在 Google C++ 编码标准中读到 Google 不使用异常。如果不使用异常,当程序中发生错误时如何释放内存?

例如 f() 调用 g(),如果 g() 有错误,我应该释放 g() 中分配的所有内存,然后调用 f() 的异常。一旦 f() 捕获到异常,f() 将释放 f() 中分配的所有内存,并退出程序。

如果不使用异常,并且g()中有错误,我可以强制退出exit(0),c++程序是否足够聪明,可以释放所有分配的内存?我的猜测是,既然c++维护了一个栈和堆,一旦程序退出,c++会自动释放栈和堆?

【问题讨论】:

  • 通常是操作系统回收内存。
  • 好吧,如果整个进程崩溃了,那么是的,内存被操作系统释放了。无论程序是用什么语言编写的。
  • 如果你禁止异常,声称某事是 C++ 可能有点欺诈。这就像为您的司机提供一辆汽车,但前提是他不使用燃料。
  • @Kerrek:可以说如果你禁止 export 使用模板,那么声称某些东西是 C++03 是欺诈性的。这实际上只是您的代码库是否使用该功能的问题。不同之处在于 Google 不使用异常,大多数人都使用,而没有人(加上或减去一个小的错误术语)使用 export。甚至 Google 也没有声称他们的这一决定是一个好的,但这是一种一贯的风格。它让你从 A 到 B,只是不舒服。
  • @Steve:也许吧,但绝对不止是 style。异常处理是支撑大多数标准库(想想分配器)和类设计基础(具有异常引发的自动清理的单一职责)的基本习惯用法。 export 是后视镜上的毛茸茸的立方体,我可以容忍它的不在... :-)

标签: c++ exception memory


【解决方案1】:

当进程因任何原因终止时,操作系统会清理所有使用的内存和文件句柄。

【讨论】:

    【解决方案2】:

    我听说某些内存类型,例如在 Windows 上,COM 全局堆内存无法为您释放。但是,大部分内存/句柄都被清理了,因为操作系统必须应对应用程序崩溃的情况。在进程本地内存和大多数句柄(如文件句柄等)的情况下,您当然可以保证它。在一般情况下,您可以假设操作系统会在您的应用程序退出后清理。

    另外,永远不要遵循 Google 的风格指南。它不适用于 C++,它适用于 C++,减去你必须带走的所有东西才能使它成为 C。它可能适用于 Google(怀疑),但它绝对不适用于其他任何人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 2011-01-13
      • 2018-08-27
      • 2011-12-31
      • 1970-01-01
      相关资源
      最近更新 更多