Как передать параметры в manage_shared_memory.construct () в Boost.Interprocess - PullRequest
2 голосов
/ 13 марта 2010

Я часами смотрел на документацию Boost.Interprocess, но так и не смог выяснить это. В документе у них есть пример создания вектора в разделяемой памяти следующим образом:

//Define an STL compatible allocator of ints that allocates from the managed_shared_memory.
//This allocator will allow placing containers in the segment
typedef allocator<int, managed_shared_memory::segment_manager>  ShmemAllocator;

//Alias a vector that uses the previous STL-like allocator so that allocates
//its values from the segment
typedef vector<int, ShmemAllocator> MyVector;

int main(int argc, char *argv[])
{
    //Create a new segment with given name and size
    managed_shared_memory segment(create_only, "MySharedMemory", 65536);
    //Initialize shared memory STL-compatible allocator
    const ShmemAllocator alloc_inst (segment.get_segment_manager());
    //Construct a vector named "MyVector" in shared memory with argument alloc_inst
    MyVector *myvector = segment.construct<MyVector>("MyVector")(alloc_inst);

Теперь я понимаю это. Я застрял в том, как передать второй параметр в segment.construct(), чтобы указать количество элементов. Межпроцессный документ дает прототип для construct() как

MyType *ptr = managed_memory_segment.construct<MyType>("Name") (par1, par2...);

но когда я пытаюсь

MyVector *myvector = segment.construct<MyVector>("MyVector")(100, alloc_inst);

Я получаю ошибки компиляции.

Мои вопросы:

  1. Кто на самом деле получает параметры par1, par2 от segment.construct, конструктор объекта, например vector? Насколько я понимаю, передается параметр распределителя шаблонов. Это правильно?
  2. Как добавить еще один параметр, помимо alloc_inst, который требуется конструктору объекта, создаваемого в разделяемой памяти?

Об этом очень мало информации, кроме кратких документов Boost.

1 Ответ

3 голосов
/ 13 марта 2010

Я задал тот же вопрос в списке рассылки продвинутых пользователей, а Стивен Ватанабе ответил , что проблема проста: std :: vector не имеет конструктора типа (size, allocator). Глядя на его документацию, я вижу, что конструктор

vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );

поэтому правильный вызов должен быть

MyVector *myvector = segment.construct<MyVector>("MyVector")(100, 0, alloc_inst);

Элементарно, мой дорогой, Ватсон, элементарно!

...