如何在c++中找到ostream类的最大大小

how to find the maximum size of ostream class in c++

本文关键字:ostream c++      更新时间:2023-10-16

我正在分配std::ostream *pout_ = output_.get();
其中output_scoped_ptr<std::stringstream> output_;

赋值后填充*pout_ <<"large strings"; appx 1172528个字符。

但在某种程度上,我不能在*pout_内插入字符。我上网查了一下这个班的最大人数是多少,但是找不到。

有人告诉我*pout_最多可以存储多少字符。有没有什么函数可以告诉我这个类的最大大小??

有几种可能导致ostream输出失败的原因。最明显的是底层的支持介质(内存,在std::ostringstream)的箱子已经满了。另一个是你达到某些内部限制:许多系统都有(或曾经有)文件大小在磁盘被填满之前很久就会遇到的限制,还有一些系统对内存中的单个对象也有类似的约束std::stringbuf类通常将其数据保存在单个对象中)。(也有可能出现硬件错误,但如果发生这种情况使用std::stringbuf,即内存错误,硬件可能不会检测它。)

所有这些都意味着对于你能做多少没有硬性限制写入流、字符串或其他。看情况,有一次,您可能会成功写入2 GB,而下一次写入1 MB或更少就会失败。实际上,在大多数情况下,你应该意识到这一事实写操作可能失败,测试结果(在最后一次刷新之后),然后如果他们这样做,准备做一些合理的事情。

在字符串流的特定情况下,当然,大约是唯一的您可能能够检测到的故障是内存不足。(一个ostream does notstreambuf传播一个异常;它设置badbit,当一个发生时,如果异常被激活对于badbit,它将抛出自己的异常,而不是重新抛出原始异常一个。这意味着std::bad_alloc不会向外传播。)
很多应用程序不处理内存不足,逻辑上应该这样做已将新处理程序设置为中止。如果将新处理程序设置为中止,那么就可以放弃对字符串的错误检查输出。

答案取决于你的编译器、平台等。它还取决于您向stringstream写入内容的方式(因为它可能需要为其缓冲区重新分配内存,从而可能导致内存碎片并因此利用率不足)。

了解极限的唯一实际方法是在目标环境中进行实际的实验。即使这样,你也只能把这些实验的结果作为一个粗略的指导。

stringstream将数据存储在内存缓冲区中。它将根据需要增长缓冲区,只要它可以。

你可以继续写,直到你用完内存。

这取决于很多因素,例如

  • 为您使用的共享对象选择了哪些加载地址
  • 程序剩余部分使用了多少内存
  • 你的地址空间碎片化有多严重

这就是为什么你在网上找不到任何文档限制。