2010-12-20 87 views
1

我想知道,什么是处理内存不足错误的好做法。处理内存不足错误的最佳做法是什么?

void SomeTask() 
{ 
    try 
    { 
     SomeObj obj = new SomeObj(); 
    } 
    catch(std::bad_alloc&) 
    { 
     // What should be done here? 
    } 


    // ... more code ... 
} 

我觉得自己默默地返回是错误的,因为程序可能运行在一个不确定的状态。那么,这里应该发生什么,我应该离开程序崩溃,还是有更好的选择?该程序作为服务运行,所以我不能只弹出错误消息。我想如果有足够的内存来做这件事,可能会记录一些东西。但是,我只是想知道,在这种情况下,你认为我应该怎么做?

谢谢。

+6

首先,不要测试null。抓住'std :: bad_alloc'。 – 2010-12-20 17:13:10

+0

好的,谢谢,明白了。 – 2010-12-20 17:20:06

+3

其次,除非你能解决它,否则不要捕获bad_alloc。这在分配点几乎没有任何地方。如果这是由主事件循环启动的某种服务,则允许该服务退出并一直回退到事件循环。如果这是普通应用程序流程的一部分,那么通常的结果就是让抛出导致应用程序终止。捕获并记录main()中的所有异常,然后重新抛出异常。 – 2010-12-20 18:27:46

回答

5

由于这是一项服务,我会在系统消息日志中写入错误。在Windows中,您可以使用Windows Event Log API。除非您在文档中另有说明,否则这可能是系统管理员希望看到失败报告的地方。另外,在大多数C++编译器中,对于失败的堆分配,std :: bad_alloc()已经取代了空返回值。

-PaulH

+1

如果你得到一个'std :: bad_alloc',机会并不会很渺茫。 – wilhelmtell 2010-12-20 18:44:51

2

由于它作为服务运行,最好让它崩溃,但要以可控的方式做到这一点首先记录错误状态,然后中止或自行终止。服务控制管理器可以配置为在服务停止不受控制时重新启动服务。

如果可能,您可以进一步强制进行自身的控制转储,这可以找出问题的原因。

你的直觉是正确的,让它死亡,因为还有什么过程要做?一旦它进入内存不足状态,它将永远不会恢复到健康状态。 RIP过程。

+0

“从不”可能有点过于强大。有些情况下您可以从OOM状态恢复。但在一般情况下,你是对的,除了让它终止之外,你无能为力。 – jalf 2010-12-20 18:36:29

+0

你说得对,我可以用“很可能不会”恢复到健康的状态。然而,在终止前倾销的好处是巨大的。 – 2010-12-20 19:56:09

2

你应该做的第一件事是尝试释放更多的内存。如果您必须定期清理对象,现在是时候完成它了。如果一切顺利,您可以继续跑步。

如果不这样做,你应该尝试保存任何需要保存到磁盘并死亡,如果你需要额外的内存,确保你在启动时抓住它。由于继续运行是不可能的,您应该死亡(abort或重新抛出异常)。

相关问题