c++ - 发生内存不足错误时怎么办?

标签 c++ windows error-handling out-of-memory

<分区>

Possible Duplicate:
What's the graceful way of handling out of memory situations in C/C++?

你好,

乍一看这似乎是一个简单的问题。而且我不想就什么是最好的方法来展开广泛的讨论....

上下文:Windows >= 5、32 位、C++、Windows SDK/Win32 API

但在询问了similar question之后,我阅读了一些 MSDN 和有关 Win32 内存管理的内容,所以现在我更加困惑如果分配失败该怎么办,比如说 C++ new 运算符。

所以我现在对如何在您的应用程序中实现(如果您确实实现了,则隐含地)OOM 错误处理非常感兴趣。
如果,在哪里(主要功能?),针对哪些操作(分配),以及您如何处理 OOM 错误。

(我真的不是主观上的意思,把它变成一个偏好问题,我只是想看到不同的方法来解释不同的条件或适合不同的情况。所以请随意为 GUI 应用程序、服务提供答案 -用户模式的东西....)

一些对 OOM 的典型 react 来说明我的意思:

  • GUI 应用:消息框、退出进程
  • 非 GUI 应用:记录错误,退出进程
  • 服务:尝试恢复,例如杀死引发异常的线程,但继续执行
  • 关键应用:重试直到分配成功(减少请求的内存量)
  • OOM 的手,让 STL/boost/OS 处理它

感谢您的回答!

解释得最好的方法将很荣幸成为一个被接受的答案 :D - 即使它只包含一个 MessageBox 行,但解释了为什么其他方法都是无用的、错误的或不必要的。

编辑:到目前为止,我很感谢您的回答,但我缺少一些实际的回答;我的意思是你们中的大多数人都说不要介意 OOM,因为当没有剩余内存(系统挂起/性能不佳)时您将无能为力。但这是否意味着避免对 OOM 进行任何错误处理?或者只在显示 MessageBox 的主界面中做一个简单的 try-catch?

最佳答案

在大多数现代操作系统上,OOM 会在系统变得完全无法使用后很长时间内发生,因为在实际用完之前,虚拟内存系统会开始将物理 RAM 分页出来,以便为分配额外的虚拟内存腾出空间,而且很可能是硬盘由于页面必须以越来越高的频率换入和换出,磁盘将开始像疯了似的抖动。

简而言之,在接近 OOM 条件之前,您需要处理更严重的问题。

旁注:目前,上述说法并不像以前那样正确,因为具有大量物理 RAM 的 32 位机器在开始分页之前可能会耗尽其地址空间。但这仍然不常见并且只是暂时的,因为 64 位逐渐普及并接近主流采用。

编辑:看来64位已经是主流了。在仔细阅读戴尔网站时,我找不到提供的 32 位系统。

关于c++ - 发生内存不足错误时怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3644381/

相关文章:

javascript - 为Express应用程序中的错误选择HTML状态代码

windows - 查看布局 rebol 3 不工作

c++ - 如何使用 boost 库中的 integer_sort?

c++ - wxWidgets 试图填满整个区域

c++ - C++ 读取文件

windows - 如何为 Windows 应用程序注册自定义键盘快捷键

windows - 为什么我的 stderr 重定向在命令完成后没有结束?我该如何解决?

xcode - 如何更改 Xcode 4 中文本突出显示的颜色以显示警告和错误?

Java/Eclipse - 在主方法之外使用 BufferedReader 时解决 IOException

c++ - 在 C++ 中填充 protobuf 字段