3

Is the size allotted based on amount of dynamically allotted memory available? what happens when we reach this limit is there an exception thrown or it overwrites to some other part of memory? Or it silently stops writing to buffer?

user1527651
  • 335
  • 1
  • 5
  • 10

2 Answers2

2

The buffer of a std::stringstream object is a wrapper around a std::string object. As such, the maximum size is std::string::max_size(). When the stream cannot allocate further, an exception will be thrown by the buffer which is probagated to the stream. The response is to turn on std::ios_base::badit in its stream state. Attempting to write pass this point will do nothing unless the stream state is cleared and the buffer is at least partially emptied.

0x499602D2
  • 87,005
  • 36
  • 149
  • 233
1

Just like std::cout, if the stream fails (for whatever reason), the state of the buffer will be set (eofbit, failbit, or badbit). This will mean that operator bool() for the stream will evaluate to 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!
}

Note: Prior to C++11, this was done via operator void*().

Also, If you wanted the stream to throw an exception (it won't by default), you can register it to throw using the std::ios::exceptions() function.

Zac Howland
  • 15,149
  • 1
  • 23
  • 37