处理使用boost :: interprocess STL兼容共享内存分配器创建的C ++对象的正确方法是什么?

时间:2013-03-17 20:24:20

标签: c++ boost boost-interprocess

我对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-like实体,我还没有说DATAPOINT是什么,但它是一个定义的结构一些浮点数和整数值。在拥有并初始创建共享内存映射的应用程序中,我像这样初始化它,主要是从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());

现在我使用这样的分配器,创建boost :: interprocess :: map&lt; ...&gt;使用 typedef PointMap:

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

现在假设我要处理这个我调用PointMap的boost::interprocess::map对象,并重用它的内存。我该怎么做?

我试过这样的事情:

segment.destruct<PointMap>(aPointMap);

但语法在这里并不完全正交。然后我想,也许是一些 像析构函数的放置语法,但我无法弄明白。

如果这一切都是神奇的而且它只是有效,而我只是delete PointMap,而这就是它的全部内容,我会觉得有点傻,但我想确定我是没有犯大错。

其次,我假设访问此共享内存的辅助进程只是以相同的方式处理,但我会使用这样的find<T>方法:

      std::pair<PointMap*, std::size_t> f = segment->find<PointMap>("SOMEOBJECT_NAME_HERE");
      aPointMap = f.first;

然后,当我完成它时,delete aPointMap或只设置aPointMap = NULL

1 个答案:

答案 0 :(得分:1)

请参阅docs,其中提供了您要执行的操作的完整示例。地图示例不会破坏容器,但会删除矢量。

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");

这可以说是正交的:你通过名称创建一个对象并传递参数,然后按名称销毁它(但不需要参数,因为析构函数不接受参数。)