Требуется ли специальному распределителю вектор Boost Interprocess для структуры, содержащей строки? - PullRequest
0 голосов
/ 04 мая 2018

Я использую 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, потому что строка делает мой вектор контейнером контейнера (из символов) и объясняет, почему я испытывал ошибки сегментации во время итерации по элементам?

1 Ответ

0 голосов
/ 04 мая 2018

Требует ли это и моя структура Complex, потому что строка делает мой вектор контейнером контейнера (с символами) и объясняет, почему я испытывал ошибки сегментации во время итерации по элементам?

Да и да.

У меня нет времени на создание отдельного примера из ваших фрагментов кода, но вот несколько ссылок, описывающих, что именно вы хотите сделать:

...