将无序映射写入共享内存不起作用

man*_*eep 0 c++ linux

我试图共享一个无序的映射(哈希映射),但它最终在它试图在地图中插入数据的行处的浮点异常结束.

有人可以帮助理解我哪里出错吗?

#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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Mik*_*our 6

通常,您不能在进程之间共享复杂的结构.特别是,指向一个进程的虚拟地址空间中的对象的指针在另一个进程中无效,并且大多数容器实现将涉及指针.

您可以查看Boost.Interprocess库,其中包含适合共享的各种容器和分配器; 特别是,只要您使用共享内存分配器,它们的版本unordered_map 就可以放在共享内存中,因此您可以简单地将其用作替代std::unordered_map(尽管您仍然需要替换为std::string密钥) .