Межпроцессное управление памятью

Я хочу выделить данные в сегменте общей памяти в одном процессе и освободить их в другом.

Я выделяю его в процессе 1 (Proc1), используя следующую строку: new_Class* pData = managed_windows_shared_memory_segment.construct<new_Class>(anonymous_instance) ()

Затем я преобразовываю указатель в дескриптор get_handle_from_address(pData), передаю его другому процессу (Proc2), преобразовываю его обратно в указатель static_cast<new_Class*>managed_windows_shared_memory_segment.get_address_from_handle(handle) и пытаюсь освободить его там. (после того, как Proc1 умер, я мог бы добавить)

когда я пытаюсь освободить его в процедуре 2 с помощью destroy_ptr(pData), я получаю надоедливое раздражающее исключение: «Необработанное исключение по адресу 0x00000000000000000», и попытка использовать deallocate(pData) не лучше.

когда я освобождаю от Proc1, все хорошо, только освобождение от Proc2 кажется проблематичным.

Любые идеи?


Проблема была вызвана виртуальным деструктором в базовом классе. Примечание для себя: не используйте виртуальные функции в общей памяти, таблица виртуальных методов НЕ является кросс-процессом.

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


person Eyal    schedule 20.07.2015    source источник
comment
Объекты, созданные с помощью managed_memory_segment.construct<MyType>, должны быть освобождены с помощью managed_memory_segment.destroy<MyType> или managed_memory_segment.destroy_ptr. Без небольшого воспроизводимого примера (или дополнительного кода для просмотра) никто не сможет вам помочь.   -  person Chad    schedule 20.07.2015
comment
Вы правы, я постараюсь добавить более полный пример, когда вернусь в офис завтра утром. что касается предложения по уничтожению‹MyType›, то оно явно не работает для анонимного_экземпляра. возможно, мне следует переосмыслить свою предпосылку и перейти к именованным экземплярам.   -  person Eyal    schedule 20.07.2015


Ответы (1)


Я настоятельно рекомендую использовать интеллектуальные указатели, как если бы вы использовали не межпроцессное распределение.

Конечно, обычный shared_ptr не урежет его, если refcount/weakref также не выделены в сегменте разделяемой памяти.

К счастью, Boost Interprocess полностью заряжен

  • boost::interprocess::shared_ptr<T>
  • boost::interprocess::make_shared<T>(...)

См. http://www.boost.org/doc/libs/1_58_0/doc/html/interprocess/interprocess_smart_ptr.html#interprocess.interprocess_smart_ptr.shared_ptr

Есть также scoped_ptr<>, unique_ptr<> и даже intrusive_ptr<> для всех ваших особых нужд :)

person sehe    schedule 21.07.2015