0

我对 Boost::interprocess 共享内存和释放有点困惑。

在 C++ 中在堆栈上创建新对象时,您只需向构造函数声明类型、变量名和参数(除非您需要默认构造函数):

 AType AVariableName(param1,param2); 

如果要使用 Boost::interprocess 分配相同的变量,我正在做这样的事情。我为密集的 typedef 系列道歉,但我想不出如何在不提供真正的 boost 模板类型扩展的情况下提出这个问题并具体化。

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

现在我像这样使用分配器,使用 typedef PointMap 创建 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);

但是这里的语法并不完全正交。然后我想,也许它像析构函数的放置语法一样,但我一直无法弄清楚。

如果这一切都是魔法而且它只是有效,而我应该只是delete PointMap,仅此而已,我会觉得有点傻,但我想确保我没有犯大错。

其次,我假设访问此共享内存的辅助进程以相同的方式简单地处理,但我会使用如下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"so 要销毁它的对象,您只需销毁该命名对象:

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

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

于 2013-03-17T20:43:12.817 回答