【问题标题】:Handling crashes caused by insufficient memory in 3rd party library处理第三方库内存不足导致的崩溃
【发布时间】:2013-08-20 22:35:11
【问题描述】:

如果使用new 动态分配大量内存,程序可能会崩溃,因为newreturns NULL。使用异常,可以捕获 std::bad_alloc 并做最适合的事情:

try{
     allocate_much_memory();                
catch( std::exception e){       
     do_something_that_fits();  
}

如果由于某种原因不能使用异常,则需要检查NULL

BigBlob* allocate_much_memory(){
   BigBlob *bblob = new BigBlob();
   if( bblob == NULL ){
        std::cerr << "uh-oh" << std::endl;
        handle_error();
   }
   return bblob;
}

据我所知,关键是您必须自己编写 NULL 检查。 如果您无法更改函数,因为它来自第三方库,并且您不使用异常,该怎么办?

更新:对于我正在检查 new BigBlob() 的结果是否为 NULL 的部分:这不是必需的:请参阅 Do I need to check for NULL after p = new Fred()? How can I convince my (older) compiler to automatically check new to see if it returns NULL?

【问题讨论】:

  • 如果第三方库编译时出现异常,而您编译时没有异常,您将无法正确链接它们。
  • @MooingDuck:有趣,你有资源解释为什么它不起作用吗?
  • @weeska:如果跨 DLL 边界抛出异常,而另一方编译时没有异常,那一方显然无法捕获它。由于该方还假设不会有异常,因此它将无法正确展开,从而导致未定义的行为,通常是崩溃。没有办法阻止对方越界抛出异常,尽管您可以创建一个异常替换中间层。
  • 我明白了,感谢您的澄清。
  • 我经常使用的简单版本是这样的:将链接视为通过电话解释游戏——你必须非常、非常具体。如果我说“足球”,而我们中的一个人戴着护垫和头盔出现,而另一个人除了踢球和足球什么都没有,事情就不会顺利进行。

标签: c++ memory exception-handling


【解决方案1】:

如果他们抛出异常,你去这里:

Global exception handling in C++

如果他们不这样做,你就完蛋了。

这也是有原因的。想想看。你怎么知道这个库中的分配在哪里?你会怎么处理失败?最后一个尤其​​重要。除了崩溃,你会怎么做?

【讨论】:

  • 糟糕的事实,措辞优美的答案 :D 我也是这么想的,但你永远不会知道。只是想知道我的选择。
猜你喜欢
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多