写一个无序的映射到共享内存不工作

我试图共享一个无序的映射(哈希映射),但它试图在地图上插入数据的行处结束浮点exception。

有人能帮助我了解我哪里出错了吗?

#include <iostream> #include <string> #include <unordered_map> #include <sys/ipc.h> #include <sys/shm.h> int main () { std::unordered_map<std::string,double> *tmp; key_t key = 5678; int shmid = shmget(key, 1000, IPC_CREAT | IPC_EXCL | 644); if(shmid == -1){ std::cerr << "Failed to create the shared segment." << std::endl; exit(-1); } void *addr = shmat(shmid, NULL, 0); if(addr == (void*)-1){ std::cerr << "Failed to attach the segment to the process." << std::endl; exit(-1); } tmp = static_cast< std::unordered_map<std::string,double>* >(addr); tmp->insert (std::pair<std::string,double>("abc",1.2)); shmdt(addr); return 0; } 

谢谢。

一般来说,你不能在进程之间共享复杂的结构。 特别是,指向一个进程的虚拟地址空间中的对象的指针在另一个进程中将不再有效,而大多数容器实现将涉及指针。

你可以看看Boost.Interprocess库,其中包含适合共享的各种容器和分配器; 尤其是它们的unordered_map版本可以放在共享内存中 ,只要你使用它们的共享内存分配器,所以你可以简单地使用它作为std::unordered_map的替代品(尽管你仍然需要替换为std::string作为键)。

您正在将您的共享内存地址转换为指向地图的指针,但是您绝不会调用构造函数来实际创建该地址的地图。 无论如何,这可能不会按照您想要的方式工作,因为映射可能会分配和释放内存,以便自己使用来自堆的内存,而不是来自共享内存区。