gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:42:57 28 4
gpt4 key购买 nike

我对 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 是什么,但它是一个用一些 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());

现在我像这样使用分配器,创建 boost::interprocess::map<...> 使用typedef 点图:

 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

最佳答案

参见 docs这给出了你想做什么的完整例子。 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");

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

关于c++ - 处理使用 boost::interprocess STL 兼容共享内存分配器创建的 C++ 对象的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15465786/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com