处理使用boost::进程间STL兼容共享内存分配器创建的c++对象的正确方法是什么?
What is the correct way to dispose of a C++ object created with boost::interprocess STL compatible shared memory allocators?
我对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");
这可以说是正交的:您按名称创建对象并传递参数,然后按名称销毁它(但不需要参数,因为析构函数不接受参数)
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 具有包含其他对象的类的对象创建顺序
- 为什么我们再次从结构对象创建结构变量?
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 如何为自定义模板对象创建专门的函数模板
- 对象创建错误的C++矢量
- 如何为Python Swigged C++对象创建和分配回调函数
- 在 C++ 中为 C 样式对象创建一个透明包装类
- 此类模板的对象创建如何工作?
- C++ 中的对象创建类型有什么区别?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 如何仅通过父类对象限制对象创建
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 无法将类对象创建为另一个类的成员
- 如何从现有基类对象创建派生类对象
- 在 DTor 之前删除的静态对象创建的线程?
- C++:定义多个构造函数时的对象创建/销毁序列
- 从对象创建矢量包装器,该对象只允许使用索引访问向量
- 是否可以为CPP中的对象创建一组指针