如何打开和关闭一个boost iostreams设备?
How do I handle opening and closing a boost iostreams Device?
我已经定义了一个名为ZipFileDevice的boost Device,它接受一个存档路径,以及该存档中文件的路径。
Device定义了read, write, seek,一个接受两条路径的构造函数和一个析构函数。
我在ZipFileDevice的构造函数中打开zip文件,并在析构函数中关闭它。
我是这样使用设备的:
boost::iostreams::stream_buffer<ZipFileDevice> kBuff("path/to/archive", "path/to/file");
std::iostream kStream(&kBuff);
kStream.read(...);
我的问题是ZipFileDevice在创建stream_buffer时被复制两次,并且副本被销毁,关闭zip文件。当我从流中读取时,文件已经关闭。
如何正确处理打开和关闭设备?
从设计原理页:
过滤器和设备必须是
CopyConstructible
或者通过boost::ref
传递到流和流缓冲区。这个要求会使Filters和Devices的设计复杂化,因为一些本来不可复制的组件必须使用引用计数。
模板
basic_file
就是一个很好的例子。Boost的预发布版本。Iostreams允许动态分配的过滤器和设备作为指针传递给流和流缓冲区,这些指针将由Iostreams库根据用户的选择拥有。这种设计被拒绝有两个原因:它不是异常安全的,并且它需要一个额外的函数参数来指示对象是否为库所有。
因此,要么将boost::ref
传递到您的设备,要么实现句柄/正文习语,例如在您的Device
类型
shared_ptr<DeviceImpl>
。
相关文章:
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 如何将 boost::mpl::vector 转换为另一个 boost::mpl::vector
- 如何编写一个 boost::spirit::qi 解析器来解析从 0 到 std::numeric_limits:<int>:max() 的整数范围?
- 创建一个 boost::线程 带有 boost::bind() 或不带
- C :如何拥有一个boost :: multi_array数组
- 为什么我必须有一个 boost::mutex for boost::condition_variable
- 在linux下使用boost::thread创建一个boost::asio工作线程
- 有没有一种方法可以为类的每个对象提供一个boost线程
- 填充一个boost元组以替代此方法
- 访问可调用对象 一个 boost::thread 是用来构造的
- 如何启动一个 boost::线程运行一个成员函数
- 如何创建一个Boost.Range来隐藏多层向量并将其公开为单个Range
- 如何将两个独立的boost::bind()组合为一个boost::函数
- 分区一个boost::range::转换后的范围适配器
- 我可以复制一个Boost::Log接收器并更改它吗?
- 将数据从调用方线程传递到另一个 boost::thread 中的方法
- 我需要删除我创建的一个boost线程吗?
- 如何编写一个 boost::spirit::qi 解析器来做'?'在正则表达式中做的事情?
- 多个async_wait从一个boost Asio deadline_timer