代码之家  ›  专栏  ›  技术社区  ›  dyp

发生内存不足错误时该怎么办?[副本]

  •  0
  • dyp  · 技术社区  · 16 年前


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

    乍一看,这似乎是一个简单的问题。我不想开始一场关于什么是最好的方法的大讨论。。。。

    similar question

    所以我现在对怎么做很感兴趣
    (拨款) ,以及如何处理OOM错误。

    • 服务:尝试恢复,例如杀死引发异常的线程,但继续执行

    :D-即使它只包含MessageBox行,但解释了为什么其他所有内容都是无用的、错误的或不必要的。

    答复 ; 我的意思是,你们大多数人都说不要介意OOM,因为当内存不足时(系统挂起/性能差),你们什么都做不了。但这是否意味着要避免OOM的任何错误处理?或者只在显示MessageBox的main中执行一个简单的try catch?

    6 回复  |  直到 9 年前
        1
  •  4
  •   Hans Passant    16 年前

    您所做的与以下情况完全相同:

    • 您创建了10000个窗口
    • 您超过了内核池内存的配额

        2
  •  4
  •   Marcelo Cantos    16 年前

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

    编辑:64位似乎已经是主流。在浏览戴尔网站时,我找不到一个32位系统。

        3
  •  1
  •   supercat    16 年前

    基本上,您应该尽可能避免用户丢失重要数据。如果磁盘空间可用,您可以写出恢复文件。如果您想提供超级帮助,可以在程序打开时分配恢复文件,以确保它们在紧急情况下可用。

        4
  •  1
  •   Joe D    16 年前

        5
  •  0
  •   gbjbaanb    16 年前

        6
  •  0
  •   James    16 年前

    这取决于你的应用程序、技能水平和时间。如果它需要全天候运行,那么显然你必须处理它。这要视情况而定。也许可以尝试一种较慢的算法,但需要较少的堆。也许你可以添加一些功能,这样如果OOM真的发生了,你的应用程序就可以自我清理,这样你就可以再试一次。

    因此,我认为答案是‘以上所有!’,除了让它崩溃。你为自己的工作感到自豪,对吗?

    不要陷入“内存太多,所以可能不会发生”的陷阱。如果每个应用程序编写者都采取这种态度,你会更经常地看到OOM,并且不是所有的应用程序都在台式机上运行,以手机为例,你很有可能在内存不足的平台上遇到OOM,相信我!