我正在分配std::ostream *pout_ = output_.get();
其中output_
为scoped_ptr<std::stringstream> output_;
分配后我填写*pout_ <<"large strings";
appx 1172528个字符。
但是在某种程度上我无法在*pout_
内插入字符。我尝试在网上冲浪,这个类的最大尺寸但找不到。
有人请告诉*pout_
我可以存储多少字符。是否有任何函数可以告诉我这个类的最大大小?
答案 0 :(得分:1)
答案取决于您的编译器,平台等。它还取决于您将内容写入stringstream
的方式(因为它可能需要为其缓冲区重新分配内存,可能导致内存碎片,因此-utilisation)。
了解限制的唯一实用方法是在目标环境中进行实际的实验。即使这样,你也应该只使用这些实验的结果作为粗略的指导。
答案 1 :(得分:1)
字符串流将数据存储在内存缓冲区中。它会根据需要增长缓冲区,只要它可以。
您可以继续写入内存,直到内存不足为止。没有固定的限制。
答案 2 :(得分:1)
输出ostream
失败有几种可能的原因。
最明显的是底层支持媒体(内存,在
std::ostringstream
)的情况已满。另一个是你
达到了一些内部限制:很多系统都有(或有)文件大小
在磁盘已满之前很久就会遇到的限制
系统对内存中的单个对象有类似的约束(和
std::stringbuf
类通常将其数据保存在单个对象中。
(也存在硬件错误的可能性,但如果发生这种情况
使用std::stringbuf
,即内存错误,硬件可能不会
检测它。)
所有这些意味着对于你能用多少没有硬性限制 写入流,字符串或其他。一切都取决于,有一次, 您可能会成功写入2 GB,然后在1 MB或更低时失败。 实际上,在大多数情况下,您应该意识到这一事实 写入可能会失败,测试结果(在最后一次刷新之后)并且是 准备好做一些合理的事情。
在字符串流的特定情况下,当然,只有
您可能检测到的失败是内存不足。 (一个
ostream
不传播来自streambuf
的异常;它
发生一个badbit
时,如果已激活异常,则设置badbit
对于std::bad_alloc
,它会抛出自己的异常,而不是重新抛出原始异常
一。这意味着{{1}}不会传播出去。)
许多应用程序不会处理内存不足,而且应该逻辑上
已将新处理程序设置为中止。如果您已将新处理程序设置为
中止,然后你可以放弃对字符串的这种错误检查
输出。
答案 3 :(得分:0)
这取决于很多因素,例如
这就是为什么你在网上找不到任何记录的限制。