0

我正在尝试共享一个无序映射(哈希映射),但它在尝试在映射中插入数据的行处出现浮点异常。

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

#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;
}

谢谢。

4

2 回答 2

6

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

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

于 2012-08-01T14:40:54.250 回答
1

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

于 2012-08-01T14:44:10.597 回答