从函数返回 boost::进程间内存映射文件

Returning boost::interprocess memory-mapped file from function?

本文关键字:内存 映射 文件 进程 返回 boost 函数      更新时间:2023-10-16

如何将此代码放入函数中,以便传递文件路径并将文件映射的字节返回到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_mappingmapped_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(); }
};