您可能需要以完全不同的方式实现您的目标!显然,您不想只delete
使用指向内存映射数组的指针,这是boost::shared_ptr<char>
用指向基地址的指针初始化的。事实上,您可能根本不应该释放该指针。
您创建的其他两个对象在退出时将超出范围,getBytes()
但这些对象实际上是依附于共享内存。您可能想要做的是将 thefile_mapping
和 themapped_region
放在一起放入一个对象中,该对象boost::shared_ptr<char>
作为删除器对象返回:这样这两个对象将存活足够长的时间以保持指向数组的存活。在调用删除函数后,这两个对象将被释放。尽管我没有检查这些是否确实是正确的接口,但大致如下所示:
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(); }
};