【问题标题】:Returning boost::interprocess memory-mapped file from function?从函数返回 boost::interprocess 内存映射文件?
【发布时间】:2013-11-29 11:44:10
【问题描述】:

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

【问题讨论】:

  • Hmya,RAII 在这里不是你的朋友。当函数返回时,那个 file_mapping 是奇闻趣事。这需要进行重大的重写,例如您返回的一个小助手类,它存储 file_mapping 和 mapped_region 以便它们能够生存。
  • 所以你是说有一个字节数组是数据成员的类,并且可能是文件在构造函数中被映射?
  • 是的,类似的。 shared_ptr 的这种用法是货物崇拜,您正在努力解决基础问题。取得成功的最好方法是暂时不要使用它:)

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


【解决方案1】:

您可能需要以完全不同的方式实现您的目标!显然你只想delete指向内存映射数组的指针,这就是boost::shared_ptr&lt;char&gt;用指向基地址的指针初始化的。事实上,您可能根本不应该释放该指针。

getBytes() 退出时,您创建的其他两个对象将超出范围,但这些对象实际上是依附于共享内存。您可能想要做的是将file_mappingmapped_region 放在一个对象中,该对象作为删除器对象放入返回的boost::shared_ptr&lt;char&gt;:这样这两个对象就会存在足够长的时间以使指向的数组保持活动状态。在调用删除函数后,这两个对象将被释放。尽管我没有检查这些是否确实是正确的接口,但大致如下:

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(); }
};

【讨论】:

    猜你喜欢
    • 2012-09-06
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2013-06-19
    • 2014-05-06
    • 2014-06-22
    • 2011-01-03
    相关资源
    最近更新 更多