Я использую Boost Interprocess для создания interprocess :: vector в разделяемой памяти. Я настроил свой класс так, чтобы я мог хранить в памяти любой тип объекта:
using namespace boost::interprocess;
template<typename T>
struct MySharedData
{
using ShmemAllocator = allocator<T, managed_shared_memory::segment_manager>;
using MyVector = vector<T, ShmemAllocator>;
MySharedData()
{
segment.reset(new managed_shared_memory(open_or_create, "memory", 10000));
const ShmemAllocator alloc_inst(segment->get_segment_manager());
vec = segment->find_or_construct<MyVector>("vector")(alloc_inst);
}
//...
//...
MyVector* vec{nullptr};
std::unique_ptr<managed_shared_memory> segment{nullptr};
}
и я добавил элементы, просто позвонив:
vec->push_back(element);
Во время тестирования я шаблонизировал свой класс с помощью int, который работал нормально. Однако, когда я позже использовал свой сложный объект, состоящий из:
struct Complex
{
std::string x;
std::string y;
double a;
int b;
};
Я столкнулся с ошибками сегментации вскоре после итерации по вектору и доступа к элементам:
std::vector<T> read()
// Mutex and condition variable stuff here
std::vector<T> toReturn;
for(auto& t : *vec)
{
toReturn.push_back(t);
}
return toReturn;
}
Я читал эту страницу:
https://www.boost.org/doc/libs/1_60_0/doc/html/interprocess/allocators_containers.html
и упоминается, что «контейнеры контейнеров» требуют, чтобы тип элемента имел свой собственный распределитель.
Требует ли это и моя структура Complex, потому что строка делает мой вектор контейнером контейнера (из символов) и объясняет, почему я испытывал ошибки сегментации во время итерации по элементам?