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
这是一团糟.您需要了解new和delete尝试你正在尝试做的工作之前.
从哪儿开始.
map = (Tree*)mmap(0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);这只是说,把那一点内存看作是一个Tree,你没有在那个内存中构造一棵树.new,它会Node在内存中的某个位置分配一个对象,并在树中保存一个指针,当它在其他地方重新打开时,指针不再有效.您还需要在映射块中存储所有节点...除了尝试理解自定义内存分配器之外,没有真正简单的答案.