使用mmap时出现段错误

mad*_*hov 2 c++ mmap segmentation-fault

我试图第一次使用mmap来存储一个包含大量数据的树对象.树类基本上包含一个指向Node类的根的指针,每个Node实例都有一个指向它的子节点的数组.我认为mmap正在做它应该做的事情,因为我可以访问树的常量成员,但是当我尝试访问指向root的指针时,我得到了一个段错误.

以下是如何使用根节点创建树:

int main(int argc, char *argv[])
{
    Tree *map;
    ...
    map = (Tree*)mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (map == MAP_FAILED) {
        close(fd);
        perror("Error mmapping the file");
        exit(EXIT_FAILURE);
    }


    Node* root = new Node("data");
    map->set_root(root);
        ...
}
Run Code Online (Sandbox Code Playgroud)

以下是我访问树的方法:

int main(int argc, char *argv[])
{
    int i;
    int fd;
    Tree *map;

    fd = open(FILEPATH, O_RDONLY);
    if (fd == -1) {
        perror("Error opening file for reading");
        exit(EXIT_FAILURE);
    }

    map = (Tree*)mmap(0, FILESIZE, PROT_READ, MAP_SHARED, fd, 0);

    if (map == MAP_FAILED) {
       close(fd);
       perror("Error mmapping the file");
       exit(EXIT_FAILURE);
    }

    Node* root = map->root();
    cout << root->data();
    ...
Run Code Online (Sandbox Code Playgroud)

root-> data()的输出提供了段错误.任何人都可以给我一个暗示我错的地方吗?请说如果我没有清楚我的问题.

提前致谢.

MADS

Nim*_*Nim 5

这是一团糟.您需要了解newdelete尝试你正在尝试做的工作之前.

从哪儿开始.

  1. map = (Tree*)mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);这只是说,把那一点内存看作是一个Tree,你没有在那个内存中构造一棵树.
  2. 当你调用时new,它会Node在内存中的某个位置分配一个对象,并在树中保存一个指针,当它在其他地方重新打开时,指针不再有效.

您还需要在映射块中存储所有节点...除了尝试理解自定义内存分配器之外,没有真正简单的答案.