std::ostringstream缓冲区的最大大小是多少?

3

分配的大小是根据可用的动态分配内存量来确定的吗?当我们达到此限制时会发生什么情况?会抛出异常还是覆盖其他部分的内存?还是无声地停止写入缓冲区?

2个回答

2
std::stringstream 对象的缓冲区是 std::string 对象的包装器。因此,最大大小为 std::string::max_size()。当流不能进一步分配时,将由缓冲区抛出异常,该异常会传播到流中。响应是在其流状态中打开 std::ios_base::badit。除非清除流状态并至少部分清空缓冲区,否则尝试在此点之后进行写入将不起作用。

1
就像std::cout一样,如果流失败(无论什么原因),缓冲区的状态将被设置(eofbit、failbit或badbit)。这意味着流的operator bool()将求值为false
std::ostringstream oss;
// a lot of output to oss here - causing a situation where you are out of available memory
if (!(oss << some_value))
{
    // oss failed to write some_value!
}

注意:在C++11之前,可以通过operator void*()来实现此操作。
另外,如果要使流抛出异常(默认情况下不会),可以使用std::ios::exceptions()函数进行注册。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接