[英]Returning boost::interprocess memory-mapped file from function?
如何將這段代碼放入函數中,以便傳遞文件路徑,並將文件映射的字節返回到char數組中? 每當嘗試完成功能后,就永遠無法讀取內容?
using boost::interprocess;
using boost;
boost::shared_ptr<char> getBytes(const char* FilePath){
shared_ptr<file_mapping> fm(new file_mapping(FilePath, read_only));
shared_ptr<mapped_region> region(new mapped_region(*fm, read_only));
shared_ptr<char> bytes(static_cast<char*>(region->get_address()));
return bytes;
}
您可能需要以完全不同的方式實現目標! 顯然,你不想只是delete
指針,內存映射數組是什么boost::shared_ptr<char>
與指針的基地址會做初始化。 實際上,您可能根本不應該釋放該指針。
當退出getBytes()
時,您創建的其他兩個對象將超出范圍,但這些對象實際上緊貼着共享內存。 您可能想要做的是將file_mapping
和mapped_region
放到一個對象中,該對象作為刪除器對象放入返回的boost::shared_ptr<char>
中:這樣,這兩個對象將活得足夠長以保持指向陣列還活着。 調用deleter函數后,將釋放兩個對象。 盡管我沒有檢查這些接口是否確實是正確的接口,但這是大致的樣子:
struct shared_memory_deleter
{
shared_memory_deleter(char const* file)
: d_fm(new file_mapping(file, read_only))
, d_region(new mapped_region(*fm, read_only))
{
}
void operator()(char*) {
this->d_region.reset(0);
this->d_fm.reset(0);
}
shared_ptr<file_mapping> d_fm;
shared_ptr<mapped_region> d_region);
};
boost::shared_ptr<char> getBytes(const char* FilePath){
shared_memory_deleter deleter(FilePath);
shared_ptr<char> bytes(deleter.d_region->get_address(), deleter);
return bytes;
}
我不確定這是否行得通,但至少有機會。 做這樣的事情可能不是一個好主意。 相反,將邏輯包裝到對象中而不使用任何共享指針可能要好得多:
class shared_memory
{
public:
shared_memory(char const* name)
: d_file(name, read_only)
, d_region(d_file, read_only)
{
}
char const* buffer() const { return d_region.get_address(); }
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.