Хранение std :: вектор в общей памятиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Хранение std :: вектор в общей памяти

Сообщение Anonymous »

Я пытаюсь поделиться 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 в комментариях.

Подробнее здесь: https://stackoverflow.com/questions/768 ... red-memory
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»