如何在c++中找到ostream类的最大大小
how to find the maximum size of ostream class in c++
我正在分配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 not从streambuf
传播一个异常;它设置badbit
,当一个发生时,如果异常被激活对于badbit
,它将抛出自己的异常,而不是重新抛出原始异常一个。这意味着std::bad_alloc
不会向外传播。)
很多应用程序不处理内存不足,逻辑上应该这样做已将新处理程序设置为中止。如果将新处理程序设置为中止,那么就可以放弃对字符串的错误检查输出。
答案取决于你的编译器、平台等。它还取决于您向stringstream
写入内容的方式(因为它可能需要为其缓冲区重新分配内存,从而可能导致内存碎片并因此利用率不足)。
了解极限的唯一实际方法是在目标环境中进行实际的实验。即使这样,你也只能把这些实验的结果作为一个粗略的指导。
stringstream将数据存储在内存缓冲区中。它将根据需要增长缓冲区,只要它可以。
你可以继续写,直到你用完内存。
这取决于很多因素,例如
- 为您使用的共享对象选择了哪些加载地址
- 程序剩余部分使用了多少内存
- 你的地址空间碎片化有多严重
这就是为什么你在网上找不到任何文档限制。
- ostream过载时的缓冲区冲洗
- 需要从 istream 和 ostream 派生 iostream
- "ostream &os"有什么用?
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- C++表达SFINAE和ostream操纵器
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- 逗号在重载 ostream 和 istream 在结构中分开
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- ostream 运算符<< 为获取 STL 容器而过载,传递 std::string 会破坏它?
- 将 ostream 包装在类中并模板化<<运算符
- 如何在C++中编写 ostream 的向量,它接收所有不同的输出流,如 cout、ostringstream 和 ofs
- 为什么在返回 ostream 类时使用引用?
- 将标准输出重定向到ostream
- boost::interprocess::file_lock 与 std::ostream 一起使用时的错误行为
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 无法从好友功能访问类的私有成员?"ostream"不是"std"的成员?
- ostream& operator<< (ostream& (*pf)(ostream&));
- 使用 ostream 变量删除代码重复