Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 处理内存不足错误的最佳实践是什么?_C++_Memory - Fatal编程技术网

C++ 处理内存不足错误的最佳实践是什么?

C++ 处理内存不足错误的最佳实践是什么?,c++,memory,C++,Memory,我想知道,处理内存不足错误的好方法是什么 void SomeTask() { try { SomeObj obj = new SomeObj(); } catch( std::bad_alloc& ) { // What should be done here? } // ... more code ... } 我觉得静默返回是错误的,因为程序可能正在不确定的状态下运行。那么,这里应该发生什么,我应该让程序崩溃,还是

我想知道,处理内存不足错误的好方法是什么

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


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


谢谢。

因为这是一项服务,我会在系统消息日志中写入一个错误。在Windows中,您可以使用。除非您在文档中另有规定,否则系统管理员可能会在这里看到故障报告

此外,在大多数C++编译器中,STD::BADYOLLC已经为失败的堆分配取代了一个空返回值。


-PaulH

因为这是一项服务,我会在系统消息日志中写入一个错误。在Windows中,您可以使用。除非您在文档中另有规定,否则系统管理员可能会在这里看到故障报告

此外,在大多数C++编译器中,STD::BADYOLLC已经为失败的堆分配取代了一个空返回值。


-PaulH

因为它是作为服务运行的,所以最好让它崩溃,但要让它以可控的方式崩溃,首先要记录错误状态,然后中止或自动终止。可以将服务控制管理器配置为在服务停止失控时重新启动服务

如果可能的话,您可以进一步强制进行受控转储,这将有可能找到问题的原因


你的直觉让它死去是正确的,因为这个过程还能做什么?一旦进入内存不足状态,它将永远无法恢复到正常状态。RIP进程。

因为它是作为服务运行的,所以最好让它崩溃,但首先通过记录错误状态,然后中止或自动终止,让它以可控的方式崩溃。可以将服务控制管理器配置为在服务停止失控时重新启动服务

如果可能的话,您可以进一步强制进行受控转储,这将有可能找到问题的原因


你的直觉让它死去是正确的,因为这个过程还能做什么?一旦进入内存不足状态,它将永远无法恢复到正常状态。RIP进程。

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


如果做不到这一点,您应该尝试将需要保存的内容保存到磁盘,然后死掉。如果您需要额外的内存,请确保在启动时预先获取它。因为继续运行是不可能的,所以您应该终止或重新引发异常。

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


如果做不到这一点,您应该尝试将需要保存的内容保存到磁盘,然后死掉。如果您需要额外的内存,请确保在启动时预先获取它。因为继续运行是不可能的,所以您应该终止或重新抛出异常。

首先,不要测试null。Catch std::bad_alloc。其次,除非你能修复它,否则不要捕捉bad_alloc。这很少接近分配点。如果这是由主事件循环启动的某种服务,则允许该服务退出并返回到事件循环。如果这是正常应用程序流的一部分,那么通常的结果就是让抛出导致应用程序终止。在main中捕获并记录所有异常,然后重新显示异常。首先,不要测试null。Catch std::bad_alloc。其次,除非你能修复它,否则不要捕捉bad_alloc。这很少接近分配点。如果这是由主事件循环启动的某种服务,则允许该服务退出并返回到事件循环。如果这是正常应用程序流的一部分,那么通常的结果就是让抛出导致应用程序终止。在main中捕获并记录所有异常,然后重新显示异常。never可能有点太强了。在某些情况下,您可以从OOM状态恢复。但在一般情况下,你是对的,除了让它终止,你别无选择。你是对的,我可以使用它,它很可能不会恢复健康状态。然而,在终止前倾销的好处是巨大的。永远不会有太大的好处。在某些情况下,您可以从OOM状态恢复。但在一般情况下,你是对的,除了让它终止,你没有别的办法。你是对的,我可以用它,很可能是n
不要回到健康的状态。然而,终止前转储的好处是巨大的。如果你得到一个std::bad_alloc,那么失败的几率也不小。如果你得到一个std::bad_alloc,那么失败的几率也不小。