Как сохранить указатель на общие данные в расширенном сегменте разделяемой памяти?
У меня есть функция, которая возвращает:
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