在共享内存中存储 std::vector

问题描述 投票:0回答:1

我试图通过将

std::vector
存储在共享内存中来在两个进程之间共享它。第一个进程尝试向向量添加一些数据,第二个进程尝试读取数据。

要创建向量,我使用如下内容:

offset_t offset = custom_malloc(sizeof(std::vector<char, CustomAllocator<char>>));

uint8_t *ptr = shared_memory_base_ptr + offset;

std::vector<char, CustomAllocator<char>> *shared_vector = new (ptr) std::vector<char, CustomAllocator<char>>();
shared_vector->push_back('S');
shared_vector->push_back('h');
shared_vector->push_back('a');

要从第二个进程读取向量,我使用以下命令:

const uint8_t *ptr = shared_memory_base_ptr + offset;

const std::vector<char, CustomAllocator<char>> *shared_vector = reinterpret_cast<const std::vector<char, CustomAllocator<char>> *>(ptr);
std::cout << shared_vector->size() << std::endl;  // 3
std::cout << shared_vector->at(0) << std::endl;  // Segfault

问题是,当尝试使用

vector->at(i)
访问任何向量位置时,由于内存地址无效,我遇到了分段错误。

我尝试使用

&(vector->at(i))
打印向量中元素的地址,它看起来像是与创建向量的第一个进程相对应的虚拟地址,这可能是第二个进程的无效地址。

有什么办法可以克服这个问题吗?第二个进程如何知道向量元素的正确地址?

c++ linux vector shared-memory mmap
1个回答
0
投票

vector
不仅仅是它保存的数据,它还是一个指向存储数据的堆分配内存的指针。因此,当您将向量放入小型共享内存中时,您使用placement-new 放置的只是一堆内务数据和指向实际数据的指针。毕竟,
sizeof
是一个编译时常量,你难道一点也不好奇为什么它适用于像
vector
这样动态的东西吗?

对于指针来说,指针只在应用程序的地址空间中有效,它甚至不能在同一台机器上的不同应用程序之间移植。此解决方案对于 IPC 不可行,您必须设计一种不同的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.