c++ - mmap() 后出现段错误

标签 c++ linux unix mmap

我想在两个进程中共享 map 指针。所以我尝试了mmap。我在单个进程中测试了 mmap。这是我的代码:

#include  <vector>
#include  <iostream>
#include  <sys/mman.h>
#include  <unistd.h>
#include  <cstdlib>
#include  <stdio.h>
#include  <map>
using namespace std;

int main(int argc, char *argv[])
{
    map<string,string> a, *b;

    b = (map<string,string> *)mmap(&a,sizeof(map<string,string>),
        PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0);

    b->insert(map<string,string>::value_type("a","b")); //error 
    cout << b->size() << endl;
}

运行到b->insert()时,出现Segmentation failure。如果我删除 b->insert(),则不会出现错误(仍然有 b->size)。我的代码有什么问题?

最佳答案

尽管有它的名字,mmap()std::map 无关。当您使用mmap()时,您可以访问没有结构的原始内存块。您不能直接在该 block 中存储像 std::map 这样的 STL 对象,因为 STL 对象内部存在与 mmap() 不兼容的内部指针。

当您使用mmap()将同一内存块映射到两个不同的进程时,该 block 甚至可能不会出现在内存中的同一地址。在定义将存储在共享内存中的数据格式时,必须考虑到这一点。

关于c++ - mmap() 后出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6087274/

相关文章:

c++ - 在QwtPlot scaleDraw中绘制向内刻度线

c++ - 有人可以帮助发现我的低锁定列表中的错误吗?

linux - 哪个命令找不到可执行的Unix脚本

regex - unix 查找字典序小于给定文件名的文件名

c++ - 控件的 CWnd::DefWindowProc 上 Stackoverlow 异常的原因是什么

C++转换题

c - 如何使用原始套接字 ping 本地主机?

linux - 我们能否将多次出现的字符串的行号捕获到变量中(仅最后一次出现)

c - 使用时间函数时出现段错误(核心转储)错误

Linux 外壳 : remove all HTML files in tree while leaving directory structure