Boost::interprocess共有メモリと割り当て解除について少し混乱しています。
C ++のスタックに新しいオブジェクトを作成するときは、型、変数名、およびパラメーターをコンストラクターに宣言するだけです(デフォルトのコンストラクターが必要な場合を除く)。
AType AVariableName(param1,param2);
同じ変数がBoost::interprocessを使用して割り当てられる場合、私はこのようなことをしています。密集した一連のtypedefについてお詫びしますが、実際のブーストテンプレート型拡張を提供せずに、この質問をして具体的にする方法を考えることはできません。
typedef int PointKeyType;
typedef DATAPOINT PointMappedType;
typedef std::pair<const int, PointMappedType> PointValueType;
typedef boost::interprocess::allocator<PointValueType,
boost::interprocess::managed_shared_memory::segment_manager> PointShmemAllocator;
typedef boost::interprocess::map<PointKeyType,
PointMappedType, std::less<PointKeyType>, PointShmemAllocator> PointMap;
これまでのところ<integer,DATAPOINT>
、共有メモリでstd :: mapのようなエンティティを作成していることを定義し、DATAPOINTとは何であるかは説明していませんが、floatと整数値で定義された構造体です。 。共有メモリマップを所有して初期化するアプリケーションでは、次のように初期化します。ほとんどの場合、Boostデモから借用したコードです。
managed_shared_memory segment
( open_or_create // or maybe it should be create_only?
,MEMORY_AREA_NAME // a string literal
,65536); //segment size in bytes
// STL compatible allocator
PointShmemAllocator point_alloc_inst (segment.get_segment_manager());
今、私はこのようなアロケータを使用し、typedefPointMapを使用してboost:: interprocess ::map<...>を作成します。
PointMap *aPointMap =
segment.construct<PointMap>("SOMEOBJECT_NAME_HERE") (std::less<PointKeyType>() //first ctor parameter
,point_alloc_inst);
boost::interprocess::map
ここで、PointMapと呼ばれるこのオブジェクトを破棄し、そのメモリを再利用するとします。それ、どうやったら出来るの?
私はこのようなことを試みました:
segment.destruct<PointMap>(aPointMap);
ただし、ここでは構文が正確に直交しているわけではありません。それからIIは、デストラクタの配置構文のようなものかもしれないと思いましたが、私はそれを理解することができませんでした。
それがすべて魔法であり、それがうまく機能し、私がただそうすることになっているならdelete PointMap
、それがすべてです、私は少しばかげていると感じますが、私は大きな間違いを犯していないことを確認したいと思います。
次に、この共有メモリにアクセスする2次プロセスは単純に同じ方法で処理されると想定していますが、次のfind<T>
ような方法を使用します。
std::pair<PointMap*, std::size_t> f = segment->find<PointMap>("SOMEOBJECT_NAME_HERE");
aPointMap = f.first;
そして、それが終わったら、delete aPointMap
それとも設定しaPointMap = NULL
ますか?