簡體   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