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

What is the maximum size of std::ostringstream buffer?

本文关键字:多少 ostringstream 缓冲区 std      更新时间:2023-10-16
大小

是否根据动态分配的可用内存量分配? 当我们达到此限制时会发生什么 是否抛出异常或覆盖到内存的其他部分?还是静默停止写入缓冲区?

std::stringstream对象的缓冲区是围绕std::string对象的包装器。因此,最大大小为 std::string::max_size() .当流无法进一步分配时,向流推进的缓冲区将引发异常。响应是在其流状态下打开std::ios_base::badit。尝试写入传递此点将无助于此点,除非清除流状态并且至少部分清空缓冲区。

就像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() 函数将其注册为引发异常。