这是一个令人尴尬的问题,但即使是使用boost.interprocess提供的精心编写的文档也不足以让我弄明白如何做到这一点。
我所拥有的是cached_adaptive_pool分配器实例,我想用它来构造一个对象,传递构造函数参数:
struct Test {
Test(float argument, bool flag);
Test();
};
// Normal construction
Test obj(10, true);
// Normal dynamic allocation
Test* obj2 = new Test(20, false);
typedef managed_unique_ptr<
Test, boost::interprocess::managed_shared_memory>::type unique_ptr;
// Dynamic allocation where allocator_instance == cached_adaptive_pool,
// using the default constructor
unique_ptr obj3 = allocator_instance.allocate_one()
// As above, but with the non-default constructor
unique_ptr obj4 = allocator_instance ... ???
这很可能是我在如何使用分配器对象方面的失败。但在任何情况下,我都看不到如何使用这个特定的分配器,使用cached_adaptive_pool中指定的接口将构造函数参数传递给我的对象。
cached_adaptive_pool
有方法:void construct(const pointer & ptr, const_reference v)
但我不明白这意味着什么,我找不到使用它的例子。
我的脑袋一整天都在模板中游泳,所以即使答案很明显,也会非常感激。
答案 0 :(得分:1)
我想我总是可以使用 placement new 语法。我们的想法是取消引用分配器返回的智能指针(在本例中为offset_ptr),然后将原始地址传递给new()。
unique_ptr obj = new(&(*allocator_instance.allocate_one())) Test(1,true)
这是这种惯用方式吗?还有很多其他地方在提供显式支持以避免使用新的位置,这让我想不到。无论如何,如果在不久的将来没有更好的提供,我会接受这个答案。
答案 1 :(得分:1)
cached_adaptive_pool有以下方法: void construct(const pointer&amp; ptr, const_reference v)但我没有 明白这意味着什么,我不能 找到使用它的例子。
它应该遵循std::allocator
的界面,在这种情况下,allocate()
会为您提供一个合适的未初始化内存块,并在给定指针上调用construct()
个新位置。
类似的东西:
allocator_instance.construct(allocator_instance.allocate_one(), Test(30, true));
但是我自己没有使用过那些游泳池。在C ++ 0x中,分配器应该能够调用任何构造函数,而不仅仅是复制构造函数,因此可能是boost的分配器已经在一定程度上支持它。
a.construct(p, 30, true); //a C++0x allocator would allow this and call new (p) Test(30, true)