我想在2个过程中共享 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()时,发生分段错误。如果删除b->insert(),则没有错误(仍然有b->size)。我的代码有什么问题?

最佳答案

您正在使用mmap分配新内存(为什么?这似乎是个坏主意...),但是您并未初始化map。使用“placement new”将其初始化。

void *p = mmap(....);
if (p == MAP_FAILED)
    abort();
map<string,string> *b = new(p) map<string,string>();
b->insert(...);

但是我怀疑有什么大错了,在这里真的不应该涉及mmap ...

编辑:听起来好像您想在两个进程之间共享内存。共享内存可能远远超出您当前的技能水平。通常,您无法将std::map对象放置在共享内存段中,因为它会包含对堆上内部对象的引用,而这些对象将不会被共享,除非您可以创建自定义分配器以仅在共享内存段内创建子对象。

您可以使用shm_open创建共享内存对象,可以使用ftruncate更改其大小,还可以使用mmap将其映射到内存中。 shm_open具有相同名称的不同进程将获得相同的对象,并且共享对象描述符也可以像文件描述符一样在进程之间传递。

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

10-15 05:15