[英]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.