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

あなたはおそらくあなたの目的をかなり違った方法で進める必要があります! 明らかに、ベースアドレスへのポインターで初期化されたメモリマップ配列へのポインターだけを使用したくない場合があります。実際、おそらくそのポインタをまったく解放すべきではありません。deleteboost::shared_ptr<char>

作成した他の 2 つのオブジェクトは、 が終了すると範囲外になりますgetBytes()が、これらは実際に共有メモリに固執するオブジェクトです。あなたやりたいことは、 と を一緒にオブジェクトに入れ、file_mappingそれmapped_regionboost::shared_ptr<char>デリータ オブジェクトとして返される に入れることです: このようにして、これらの 2 つのオブジェクトは、ポイントされた配列を存続させるのに十分な長さになります。deleter 関数が呼び出されると、2 つのオブジェクトが解放されます。これらが実際に正しいインターフェイスであるかどうかは確認していませんが、これは大まかに次のようになります。

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 に答える