あなたはおそらくあなたの目的をかなり違った方法で進める必要があります! 明らかに、ベースアドレスへのポインターで初期化されたメモリマップ配列へのポインターだけを使用したくない場合があります。実際、おそらくそのポインタをまったく解放すべきではありません。delete
boost::shared_ptr<char>
作成した他の 2 つのオブジェクトは、 が終了すると範囲外になりますgetBytes()
が、これらは実際に共有メモリに固執するオブジェクトです。あなたがやりたいことは、 と を一緒にオブジェクトに入れ、file_mapping
それmapped_region
をboost::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(); }
};