什么可能导致流进入"bad"状态?
What could cause a stream to enter the "bad" state?
在C++中,每个流都有一个bad
位:
当读取或写入数据时发生错误,通常会导致流的完整性丢失时,通过对流执行的操作来设置此标志。
来源
是什么导致流"失去完整性"并进入bad
状态?这与fail
状态不同,后者通常发生在输入流试图将值存储到无法接受所述值的变量中时(例如,试图将字符串存储到整数变量中)。
注意,这个问题是c++文件坏比特的一种更通用的形式,它特定于文件输入流;这个问题并不完全重复,因为它通常适用于输入流和输出流。
根据cppreference.com:
标准库在以下情况下设置坏比特:
put()
或write()
插入输出流失败原因通过
operator<<
、std::put_money
或std::put_time
,无法完成,因为输出结束流已到达(facet的格式化输出函数,如num_put::put()
或money_put::put()
返回迭代器iter
iter.failed()==true
)流是用
rdbuf()
的空指针构造的,或者putback()
/unget()
在具有空rdbuf()
或传递给operator<<(basic_streambuf*)
的空指针
rdbuf()->sputbackc()
或rdbuf()->sungetc()
返回traits::eof()
putback() or
取消()`
rdbuf()->pubsync()
向sync()
、flush()
或CCD_ 25在CCD_ 26流上的析构函数的任何成员函数在I/O操作期间引发异常相关联的流缓冲器(例如
sbumpc()
、xsputn()
、sgetc()
,overflow()
等)
iword()
或pword()
(如std::bad_alloc
)中抛出异常
这可能是选择cppreference.com而不是www.cpluplus.com的另一个原因,请参阅:cplusplus.com怎么了?
查看Apache C++标准库用户指南。这里列出了造成坏消息的两个潜在原因。我引用:
内存不足:没有可用的内存来创建缓冲区,或者由于其他原因(例如从流外部提供)缓冲区的大小为0,或者流无法为自己的内部数据分配内存。
底层流缓冲区抛出异常:流缓冲区可能会失去完整性,如内存不足、代码转换失败或外部设备出现不可恢复的读取错误。流缓冲区可以通过抛出异常来指示这种完整性的损失,该异常被流捕获并导致在流的状态中设置坏比特。
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- 在容器上移动分配:以前包含的对象的状态
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- 具有动态大小的特征矩阵的默认初始状态
- 如何从Clojure调用C++程序,以使程序保持打开状态?
- 什么可能导致流进入"bad"状态?