2010-04-07 53 views
7

这是一个令人尴尬的问题,但即使是boost.interprocess提供的精心编写的文档也不足以让我弄清楚去做这个。C++的分配器,特别是将构造函数的参数传递给分配给boost :: interprocess :: cached_adaptive_pool的对象::

我已经是一个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)但我不明白这是什么意思,我找不到使用它的例子。

我的头一整天都在模板中游泳,所以即使答案很明显,我们也会非常感激。

回答

1

cached_adaptive_pool有方法: 无效结构(常量指针& 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) 
+0

谢谢。第一种形式是我期望的答案,但是太困惑和疲倦,无法意识到自己。第二种形式'a.construct(p,30,true)'似乎没有被这个特定的boost分配器支持。令人讨厌的是,由于'cached_adaptive_pool.construct()'返回'void',我必须写'allocator_t :: pointer obj = allocator.allocate_one(); allocator.construct(obj,Test(30,true))'?我不确定更糟糕的是,使用两个语句进行一个简单的操作,或者直接使用有点奇怪的放置位置。 – porgarmingduod 2010-04-07 22:47:52

+0

你可以做一个单独的函数。 – UncleBens 2010-04-08 07:13:44

1

我想我总是可以用放置新的语法。这个想法是取消引用由分配器返回的智能指针(在本例中为offset_ptr),然后将原始地址传递给new()。

unique_ptr obj = new(&(*allocator_instance.allocate_one())) Test(1,true) 

这是做到这一点的惯用方式?还有很多其他的地方在提供明确的支持,以避免使用新的位置,这让我觉得没有。无论如何,如果在不久的将来没有更好的办法,我会接受这个答案。

+0

什么是&* ptr'序列? – UncleBens 2010-04-08 07:12:59

+0

当我测试它时,new只接受一个原始指针,而不是这些分配器返回的offset_ptr。 – porgarmingduod 2010-04-08 23:02:39

相关问题