我想知道,处理内存不足错误的好方法是什么。
void SomeTask()
{
try
{
SomeObj obj = new SomeObj();
}
catch( std::bad_alloc& )
{
// What should be done here?
}
// ... more code ...
}
我觉得默默地返回是错误的,因为程序可能在不确定的状态下运行。那么,这里应该发生什么,我应该让程序崩溃,还是有更好的选择呢?该程序作为服务运行,因此我不能只弹出错误消息。我想如果有足够的内存可以记录一些东西可能是可能的。但是,我只是想知道,在这种情况下你认为我该怎么做?
感谢。
答案 0 :(得分:5)
由于这是一项服务,我会在系统消息日志中写错误。在Windows中,您可以使用Windows Event Log API。除非您在文档中另有说明,否则这可能是系统管理员希望看到失败报告的地方。
此外,在大多数C ++编译器中,std :: bad_alloc()已取代失败堆分配的空返回值。
-PaulH
答案 1 :(得分:2)
由于它作为服务运行,因此最好让它崩溃,但首先通过记录错误状态然后中止或自终止来以受控方式执行此操作。服务控制管理器可以配置为在服务停止控制时重新启动服务。
如果可能的话,你可以通过强制控制自身转储来进一步发展,这样就可以找到问题的原因。
你的直觉让它死了是正确的,因为还有什么工作要做?一旦它到达内存不足的状态,它将永远不会恢复到健康状态。 RIP流程。
答案 2 :(得分:2)
你应该做的第一件事就是尽量释放更多的记忆。如果您必须定期擦除对象,现在是时候做了。如果一切顺利,你可能只能继续跑步。
如果失败了,你应该尝试保存任何需要保存到磁盘和死机的东西,如果你需要额外的内存,请确保你在启动时提前获取它。由于继续运行是不可能的,你应该死(abort
或重新抛出异常)。