繁体   English   中英

如何处理Boost iostreams设备的打开和关闭?

[英]How do I handle opening and closing a boost iostreams Device?

我定义了一个名为ZipFileDevice的增强设备,它使用一个存档路径以及该存档中文件的路径。

设备定义读取,写入,查找,采用两条路径的构造函数和析构函数。

我正在ZipFileDevice的构造函数中打开zip文件,并在析构函数中将其关闭。

这是我使用设备的方式:

boost::iostreams::stream_buffer<ZipFileDevice> kBuff("path/to/archive", "path/to/file");
std::iostream kStream(&kBuff);
kStream.read(...);

我的问题是在创建stream_buffer时,ZipFileDevice被复制了两次,副本被销毁,关闭了zip文件。 当我从流中读取时,文件已关闭。

如何正确处理打开和关闭设备?

设计原理页面

过滤器和设备必须是CopyConstructible 或者必须使用boost::ref传递到流和流缓冲区

由于某些原本不可复制的组件必须使用引用计数 ,所以此要求会使过滤器和设备的设计复杂化。

模板basic_file是一个很好的例子。 Boost.Iostreams的预发行版本允许将动态分配的过滤器和设备作为指针传递给流和流缓冲区,这些指针将由用户选择,由Iostreams库拥有。 拒绝该设计有两个原因:它不是异常安全的,并且它需要一个额外的函数参数来指示对象是否归库所有。

因此,可以将boost::ref传递给您的设备,或者实现一个Handle / Body习惯用法,例如在您的Device类型内部使用shared_ptr<DeviceImpl>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM