我已经定义了一个名为ZipFileDevice的提升设备,它接收一个存档路径,以及该存档中文件的路径。
设备定义读取,写入,搜索,采用两个路径的构造函数和析构函数。
我在ZipFileDevice的构造函数中打开zip文件,并在析构函数中关闭它。
这就是我使用设备的方式:
boost::iostreams::stream_buffer<ZipFileDevice> kBuff("path/to/archive", "path/to/file");
std::iostream kStream(&kBuff);
kStream.read(...);
我的问题是ZipFileDevice在创建stream_buffer时被复制了两次,并且副本被销毁,关闭了zip文件。当我从流中读取时,该文件已被关闭。
如何正确处理打开和关闭设备?
答案 0 :(得分:0)
过滤器和设备必须为
CopyConstructible
,或使用boost::ref
传递给流和流缓冲区。此要求可能会使过滤器和设备的设计复杂化,因为某些组件可能不可复制 必须使用引用计数 。
模板
basic_file
是一个很好的例子。 Boost.Iostreams的预发布版本允许动态分配的过滤器和设备作为指针传递给流和流缓冲区,这些指针将由用户选择的Iostreams库拥有。此设计被拒绝有两个原因:它不是异常安全的,它需要一个额外的函数参数来指示对象是否归图书馆所有。
因此,要么boost::ref
传递给您的设备,要么实现句柄/身体习语,例如在shared_ptr<DeviceImpl>
类型
Device