簡體   English   中英

從函數返回boost :: interprocess內存映射文件?

[英]Returning boost::interprocess memory-mapped file from function?

如何將這段代碼放入函數中,以便傳遞文件路徑,並將文件映射的字節返回到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>中:這樣,這兩個對象將活得足夠長以保持指向陣列還活着。 調用deleter函數后,將釋放兩個對象。 盡管我沒有檢查這些接口是否確實是正確的接口,但這是大致的樣子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM