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

标签 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;
}

谢谢。

最佳答案

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

你可以看看 Boost.Interprocess包含适合共享的各种容器和分配器的库;特别是他们的 unordered_map 版本 can be placed in shared memory ,只要您使用它们的共享内存分配器,您就可以简单地使用它来替代 std::unordered_map(尽管您仍然需要替代 std: :string 作为键)。

关于c++ - 将无序映射写入共享内存不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11761517/

相关文章:

ruby-on-rails - 无法在 Linux Mint 中安装 curb gem

linux - 提交后自动更新 SVN 并将其导出为 zip

linux - 我如何找到这个 al 寄存器中的值?

c++ - GCC 如何连接多个 C++ std::string 变量?

android - 创建安卓应用

c++ - C++等同于Python的“构造”库

linux - 在弄清楚如何使用 ioctl/SIOCGIFADDR/SIOCGIFCONF 在 Mac OS X 上获取以太网接口(interface)信息时遇到问题?

Linux 终端上的 Python 颜色输出不起作用

C++ 通过引用传递指针并分配默认值

c++ - 错误 : invalid conversion from ‘char*’ to ‘char’ [-fpermissive]