是否根据动态分配的内存量分配大小?当我们达到这个限制时会发生什么事情抛出异常或者覆盖到内存的其他部分?或者它默默地停止写入缓冲区?
答案 0 :(得分:2)
std::stringstream
对象的缓冲区是std::string
对象的包装器。因此,最大大小为std::string::max_size()
。当流不能进一步分配时,将被检测到流的缓冲区抛出异常。响应是在其流状态中打开std::ios_base::badit
。除非清除流状态并且缓冲区至少部分清空,否则尝试写入传递此点将不会执行任何操作。
答案 1 :(得分: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()
函数将其注册为抛出。