увеличить межпроцессную общую память с классом внутри класса

Мне нужно создать структуру в разделяемой памяти. Это пример классов:

struct A{
 std::string str1;
 int val;
}
struct B{
  A inner;
  std::string name;
}

Я не смог найти пример этого в Интернете, но после некоторого поиска я смог увидеть, что мне может понадобиться реализовать некоторые распределители, и такие типы, как строка, не должны использоваться как голые, поэтому я создал распределитель для строк, которые выглядит так:

typedef allocator<char, ip::managed_shared_memory::segment_manager> char_alloc 
class String2: public ip::basic_string<char, std::char_traits<char>, char_alloc > { public:     
    String2(char_alloc& _all): ip::basic_string<char, std::char_traits<char>,  char_alloc >(_all) {;} };

Но теперь у меня есть некоторые проблемы, пытаясь понять, как я могу создать распределитель, который работает так для обоих классов.

У кого-нибудь есть пример чего-то подобного?

заранее спасибо


person jpereira    schedule 24.07.2014    source источник


Ответы (3)


Вы должны попробовать использовать char, а не std::string.

struct A{
 char str1[64];
 int val;
};

struct B{
 A inner;
 char name[64];
};
person Bumble    schedule 08.08.2014

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

void* some_shared_mem; // initialized somehow
B* shared_B = new (some_shared_mem) B; // call the B constructor.
share_B->A.val = 5;

НО, вы не должны помещать в разделяемую память ничего, что выделяет указатели. Даже если вы гарантируете, что эти указатели ссылаются на разделяемую память, вы не можете быть уверены, что каждый процесс, совместно использующий память, увидит разделяемую память по одному и тому же адресу. some_shared_mem может быть 0x10000 в программе и 0x20000 в какой-то другой программе. Таким образом, даже если общий указатель выделен из общей памяти (скажем, 0x10010), программа с отображением 0x20000 увидит точку как 0x10010, которая с ее точки зрения не находится внутри общей памяти.

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

person jmucchiello    schedule 08.08.2014

Этот ответ приходит немного позже, но для дальнейшего использования "Контейнеры контейнеров" из библиотеки Interprocess имеет именно этот вариант использования.

person rocarvaj    schedule 22.07.2019