能否将现有C++数组直接映射至boost::interprocess::shared_memory_object?
问题分析与解决
你的思路存在一个关键误解:mapped_region构造函数的最后一个参数是映射地址的建议值,不是让操作系统把共享内存直接绑定到你现有数组的内存地址上。
为什么你的代码会报错?
my_array_of_size_n是你进程私有内存(栈或堆)里的区域,已经被占用,操作系统不可能把共享内存映射到一个已被使用的地址上,所以直接触发library_error。退一步说,就算系统允许这么做,也会覆盖你原有的数组数据,而且其他进程映射共享内存时,由于地址空间独立,也不会映射到同一个地址,完全达不到共享的目的。
正确的实现方式
如果你想避免memcpy的复制操作,应该一开始就把数组分配在共享内存区域里,而不是先在私有内存创建数组再复制。用Boost的managed_shared_memory可以直接在共享内存中构造数组:
#include <boost/interprocess/managed_shared_memory.hpp> #include <algorithm> namespace bip = boost::interprocess; int main() { const int n = 100; int my_array_of_size_n[n] = {1,2,3,...}; // 你的现有数组 // 创建/打开共享内存,指定足够大小 bip::managed_shared_memory shm(bip::open_or_create, "ContribMem", n * sizeof(int)); // 在共享内存中构造一个大小为n的int数组 int* shared_array = shm.construct<int>("ContribArray")[n](); // 可选:把现有数组的内容初始化到共享数组里(如果需要保留原有数据) std::copy(my_array_of_size_n, my_array_of_size_n + n, shared_array); // 其他进程可以通过"ContribMem"和"ContribArray"访问这个共享数组 return 0; }
如果必须基于已有的私有内存数组,那只能通过memcpy复制到共享内存,也就是你最开始的实现方式——这是操作系统内存模型决定的,私有内存和共享内存是完全隔离的地址空间,没有办法直接"共享"私有内存里的数组给其他进程。
内容的提问来源于stack exchange,提问作者ipcamit
相关产品推荐
相关产品推荐

