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

What is the correct way to dispose of a C++ object created with boost::interprocess STL compatible shared memory allocators?

本文关键字:对象 创建 c++ 是什么 方法 分配器 共享 进程 boost STL 处理      更新时间:2023-10-16

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

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

 AType AVariableName(param1,param2); 

如果使用Boost::interprocess分配相同的变量,我会这样做。我为密集的类型扩展系列道歉,但我不知道如何问这个问题,并且没有真正的增强模板类型扩展。

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

现在我像这样使用分配器,创建boost::interprocess::map<…>使用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 ?

请参阅文档,其中给出了您想要做的完整示例。map示例不会破坏容器,但vector示例会。

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

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