0

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ますか?

4

1 に答える 1

1

やりたいことの完全な例を示すドキュメントを参照してください。マップの例ではコンテナは破棄されませんが、ベクトルは破棄されます。

PointMap *aPointMap =
       segment.construct<PointMap>("SOMEOBJECT_NAME_HERE")
                                 (std::less<PointKeyType>() //first  ctor parameter
                                 ,point_alloc_inst);

それは、"SOMEOBJECT_NAME_HERE"その名前付きオブジェクトを破壊するだけでそれを破壊するように命名されたオブジェクトを作成します:

segment.destroy<PointMap>("SOMEOBJECT_NAME_HERE");

これは間違いなく直交です。名前でオブジェクトを作成し、引数を渡し、名前で破棄します (ただし、デストラクタは引数を取らないため、引数は必要ありません)。

于 2013-03-17T20:43:12.817 に答える