Я пытаюсь поделиться std :: vector между двумя процессами, сохраняя его в общей памяти. Первый процесс пытается добавить некоторые данные в вектор, а второй процесс пытается прочитать данные.
offset_t offset = custom_malloc(sizeof(std::vector));
uint8_t *ptr = shared_memory_base_ptr + offset;
std::vector *shared_vector = new (ptr) std::vector();
shared_vector->push_back('S');
shared_vector->push_back('h');
shared_vector->push_back('a');
< /code>
Чтобы прочитать вектор из второго процесса, я использую следующее: < /p>
const uint8_t *ptr = shared_memory_base_ptr + offset;
const std::vector *shared_vector = reinterpret_cast(ptr);
std::cout size() at (i)
Есть ли это способ преодолеть? Как второй процесс может знать правильные адреса для векторных элементов?[code]template
class CustomAllocator
{
public:
using value_type = T;
CustomAllocator() noexcept {}
T *allocate(std::size_t n) {
const offset_t offset = custom_malloc(n * sizeof(T));
return reinterpret_cast(shared_memory_base_ptr + offset);
}
void deallocate(void *p, std::size_t n) {
(void)n;
if (p) {
const offset_t offset = static_cast(p) - shared_memory_base_ptr);
custom_free(offset);
}
}
};
Я понимаю, что сам вектор содержит указатели на свои базовые структуры, которые не будут действительными в отдельном процессе, если общая память не отображается по тому же виртуальному адресу, как указано @dmitry в комментариях.
Я пытаюсь поделиться std :: vector между двумя процессами, сохраняя его в общей памяти. Первый процесс пытается добавить некоторые данные в вектор, а второй процесс пытается прочитать данные.[code]offset_t offset = custom_malloc(sizeof(std::vector));
uint8_t *ptr = shared_memory_base_ptr + offset;
std::vector *shared_vector = new (ptr) std::vector(); shared_vector->push_back('S'); shared_vector->push_back('h'); shared_vector->push_back('a'); < /code> Чтобы прочитать вектор из второго процесса, я использую следующее: < /p> const uint8_t *ptr = shared_memory_base_ptr + offset;
const std::vector *shared_vector = reinterpret_cast(ptr); std::cout size() at (i) Есть ли это способ преодолеть? Как второй процесс может знать правильные адреса для векторных элементов?[code]template class CustomAllocator { public: using value_type = T;
void deallocate(void *p, std::size_t n) { (void)n; if (p) { const offset_t offset = static_cast(p) - shared_memory_base_ptr); custom_free(offset); } } }; [/code] Я понимаю, что сам вектор содержит указатели на свои базовые структуры, которые не будут действительными в отдельном процессе, если общая память не отображается по тому же виртуальному адресу, как указано @dmitry в комментариях.