从函数返回boost :: interprocess内存映射文件?

时间:2013-11-15 22:47:40

标签: c++ memory-management boost file-mapping

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

1 个答案:

答案 0 :(得分:0)

你可能需要完全不同的目标!很明显,只想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(); }
};