0

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

1 回答 1

0

您可能需要以完全不同的方式实现您的目标!显然,您不想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(); }
};
于 2013-11-15T23:33:34.937 回答