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

时间:2011-07-06 13:06:08

标签: c++

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

分配后我填写*pout_ <<"large strings"; appx 1172528个字符。

但是在某种程度上我无法在*pout_内插入字符。我尝试在网上冲浪,这个类的最大尺寸但找不到。

有人请告诉*pout_我可以存储多少字符。是否有任何函数可以告诉我这个类的最大大小?

4 个答案:

答案 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)

这取决于很多因素,例如

  • 为您使用的共享对象选择了哪些加载地址
  • 您的程序其余部分使用了多少内存
  • 您的地址空间变得多么糟糕

这就是为什么你在网上找不到任何记录的限制。