контейнер multi_index в разделяемой памяти

У меня есть эта структура:

struct myData
{
unsigned long id;
int age;
int phone;

myData(){};
myData(unsigned long id_, int age_, int phone_)
:id(id_),age(age_),phone(phone_){}
~myData(){};
};

Этот контейнер multi_index:

typedef multi_index_container<
myData,
indexed_by<
random_access<>,  // keep insertion order
ordered_non_unique< member<myData, int, &myData::age> >
>
> myDataContainerType;

typedef myDataContainerType::nth_index<1>::type myDataContainerType_by_Id;
myDataContainerType myDataContainer;

и эта функция вставки:

bool insert(unsigned long id, int age, int phone) {

myDataContainerType::iterator it;
bool success;
boost::mutex::scoped_lock scoped_lock(mutex); // LOCK
std::pair<myDataContainerType::iterator, bool> result = myDataContainer.push_back(myData(id, age, phone));
it = result.first;
success = result.second;
if (success)
return true;
else
return false;
}

поэтому я хотел бы поместить этот контейнер muti_index в shared memory чтобы сделать его доступным и из других приложений. Я видел этот а также тот пример, но я этого не понял allocator вообще (зачем мне нужен распределитель символов? Какой тип распределителя мне нужно использовать здесь и т. д …)

Может кто-нибудь объяснить мне, как поместить этот контейнер в общую память?

Спасибо большое…

РЕДАКТИРОВАТЬ:

Хорошо, я добавил свой код это:

myDataContainerType *myDataContainer ;

void createInSharedMemory()
{
managed_shared_memory segment(create_only,"mySharedMemory", 65536);

myDataContainer = segment.construct<myDataContainerType>
("MyContainer")            //Container's name in shared memory
( myDataContainerType::ctor_args_list()
, segment.get_allocator<myData>());  //Ctor parameters

}

и попробуйте вставить данные так:

bool insert(unsigned long id, int age, int phone) {

myDataContainerType::iterator it;
bool success;
boost::mutex::scoped_lock scoped_lock(mutex); // LOCK
std::pair<myDataContainerType::iterator, bool> result = myDataContainer->insert(MyData(id, age, phone));

it = result.first;
success = result.second;
if (success)
return true;
else
return false;
}

но я получаю эту ошибку в строке вставки: (в offset_ptr.hpp)

Unhandled exception at 0x000000013fa84748 in LDB_v1.exe: 0xC0000005: Access violation reading location 0x0000000001d200d0.

Любая идея, пожалуйста ???

1

Решение

Вы проверили ли myDataContainerне является нулевым после вызова segment.construct? Может быть, вам нужно использовать segment.find_or_construct вместо.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]