处理bad_alloc时使用cerr是否安全?

时间:2015-09-21 16:10:41

标签: c++ exception-handling

这样使用std::cerr是否安全?

try 
{
      Something();
} 
catch(std::bad_alloc) 
{
    cerr << "Out of memory!";
}

它是否使用动态内存?如果它失败了,它会抛出异常还是不输出任何内容?

2 个答案:

答案 0 :(得分:1)

简单案例

有一个失败的大分配 - 可能是由于程序员的错误 -

ImportError: No module named pygame

在这里,即使int main() { try { std::size_t bytesToAllocate; std::cin >> bytesToAllocate; std::unique_ptr<char> ptr { new char[bytesToAllocate - 1] }; // ops, if user enters 0 or extraction fails we get // std::numeric_limits<std::size_t>::max() -1 bytes to allocate } catch (const std::bad_alloc& e) { std::cerr << "Failed to allocate memory.\n"; } } 失败,我们肯定会有更多的内存,因为之前没有使用过。

现实案例

如果由于某些未指明的原因,字符插入失败,则会启用内部newfailbit,如果setstate(std::ios_base::failbit) failbit,则会引发异常。此外,如果在插入期间抛出异常,则设置badbit,如果在exception上设置badbit,则重新抛出异常。

然而,AFAIK,它未被发现,因此未指明此类操作是否分配内存以及它是如何完成的。由于内存不足的保护,你的程序可能会被杀死,因此如果在这种情况下完全可以进行异常传播,那么就没有机会捕获异常。

答案 1 :(得分:1)

standard(27.7.3.6,第1057页)定义了ostream中格式化输出函数的一些要求:

  

每个格式化的输出函数都由构建类哨兵的对象开始执行。如果在转换为bool类型的值时此对象返回true,则该函数会尝试生成请求的输出。如果生成失败,则格式化的输出函数会设置状态(ios_base :: failbit),可能会引发异常。如果在输出期间抛出异常,那么ios :: badbit在* this的错误状态下打开328。如果(exceptions()&amp; badbit)!= 0 则重新抛出异常。无论是否抛出异常,都会在离开格式化输出函数之前销毁sentry对象。如果没有抛出异常,则格式化输出函数的结果是* this。

(强调我的)

对于sentry对象的构造(与任何对象的构造一样),程序将需要更多的内存。无论是静态还是动态内存都未指定。另外,作为黑人&#39;答案很好地总结,标准定义了启用failbit时可能抛出异常。