【发布时间】:2015-12-18 10:16:05
【问题描述】:
这样使用std::cerr安全吗?
try
{
Something();
}
catch(std::bad_alloc)
{
cerr << "Out of memory!";
}
它是否使用动态内存?如果失败,会抛出异常还是不输出任何东西?
【问题讨论】:
-
我认为
cerr在程序启动时初始化后不太可能从堆中获取内存。我不确定有什么可以保证的。它的初始化是有保证的,这也是通常获取堆资源的地方。 -
我不知道标准中的任何一行保证
cerr <<永远不会尝试从堆中分配内存,但它保证会进行无缓冲输出并刷新某些其他流,所以它是给定的实现不太可能。测试一个循环,一次吞噬一个字节,看看你的循环是否如此? -
我刚刚发现(根据标准),即使在初始化之后,
cerr在第一次调用std::basic_ios::copyfmt时也会为数组分配内存。我想在程序开始时调用它可能会让你更安全......? -
Gah 根据en.cppreference.com/w/cpp/io/ios_base/iword,该数组似乎可以随时重新分配。我认为所有的赌注都没有了。当灾难袭来时,它就是一场灾难。