这样使用std::cerr
是否安全?
try
{
Something();
}
catch(std::bad_alloc)
{
cerr << "Out of memory!";
}
它是否使用动态内存?如果它失败了,它会抛出异常还是不输出任何内容?
答案 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";
}
}
失败,我们肯定会有更多的内存,因为之前没有使用过。
如果由于某些未指明的原因,字符插入失败,则会启用内部new
,failbit
,如果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时可能抛出异常。