Как сохранить указатель на общие данные в расширенном сегменте разделяемой памяти - PullRequest
0 голосов
/ 16 марта 2019

Как сохранить указатель на общие данные в расширенном сегменте разделяемой памяти?

У меня есть функция, которая возвращает:

shm.construct<SharedData>(_nameSeg.c_str())(innerDataAllocator);

Но вне функции объект, указанный в SharedData, недоступен. Почему?

Моя общая проблема заключается в том, что я хочу иметь способ получать и устанавливать данные в разделяемой памяти, но каждый раз без необходимости:

  • получи шм
  • найти объект в shm по его имени
  • построить распределители.

Итак, я пытаюсь сохранить структуру:

  • распределители
  • указатель на общий объект

Это хорошая идея / дизайн? Как я мог это сделать?

EDIT

Вот тип класса, который я хотел бы иметь, это синглтон, хранящий информацию о текущем shm:

typedef bip::allocator<wchar_t, bip::managed_shared_memory::segment_manager> CharAllocator;
typedef bip::basic_string<wchar_t, std::char_traits<wchar_t>, CharAllocator> MyShmString;

class InnerData {
public:
    uint64_t id;
    MyShmString name;
    uint8_t status;
    static const uint8_t defaultStatus = 3;

    InnerData(CharAllocator cAlloc):name(cAlloc) {

    }
};

typedef bip::allocator<InnerData, bip::managed_shared_memory::segment_manager> InnerDataAllocator;
class Zone {
public:
    SharedData * sharedData;

    CharAllocator     charAllocator;
    InnerDataAllocator   innerDataAllocator;

    Zone():{} //here I need to initialize charAllocator and innerDataAllocator with shm.get_segment_manager(),
              // because bip::allocators don't have default constructors


    static Zone create(std::string &_name, std::string &_nameSeg); 
    static Zone get(std::string &_name, std::string &_nameSeg);
    static Zone delete(std::string &_name, std::string &_nameSeg);
    void putInShm(const std::vector<UsualInnerData> &in);
    static bool alreadyCreated;
};

в .cpp

Zone::create(std::string &_name, std::string &_nameSeg){
     //create the shm
     // create allocators charAllocator and innerDataAllocator, passing shm.get_segment_manager()
     //construct the sharedData object (with shm.construct<SharedData>(_nameSeg.c_str())(innerDataAllocator))
     //create a Zone
     Zone z(charAllocator, innerDataAllocator, sharedData );
     return z;
}

В этом случае конструктор Zone будет:

Zone(CharAllocator _charAllocator, InnerDataAllocator _innerDataAllocator, SharedData* _sharedData):
    charAllocator(_charAllocator),
    innerDataAllocator(_innerDataAllocator),
    sharedData(_sharedData)
{}

Но тогда, как я уже сказал, после того, как мы выйдем из Zone :: Create, данные, на которые указывает указатель SharedData (который находится внутри возвращаемой зоны z), освобождаются из памяти.

И вторая проблема в Zone :: putInShm:

void Zone::putInShm(const std::vector<UsualInnerData> &in){
        InnerData newInnerData (charAllocator);
        MyShmString newShmString(charAllocator)
    for (auto a : in) {
        newInnerData.id = a.id;
        newShmString = a.name.c_str();//Here I get an access violation, which means charAllocator is bad ?
        newInnerData.name = newShmString 
        sharedData->data.push_back(newInnerData);
    }
    return;
}

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

Вот минимальный скомпилированный код. Он воспроизводит ошибки, описанные выше: https://uploadfiles.io/8o8zo пароль: stackoverflow

...