【发布时间】:2011-11-29 20:28:11
【问题描述】:
我第一次尝试使用 mmap 来存储一个包含大量数据的树对象。树类基本上包含一个指向类节点根的指针,每个节点实例都有一个指向它的子节点的指针数组。我认为 mmap 正在做它应该做的事情,因为我可以访问树的常量成员,但是当我尝试访问指向根的指针时,我得到了一个段错误。
以下是创建具有根节点的树的方法:
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);
...
}
这是我访问树的方式:
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();
...
root->data() 的输出提供了一个段错误。谁能给我一个提示我错在哪里?如果我没有把我的问题说清楚,请说出来。
提前致谢。
疯狂
【问题讨论】:
-
您的代码令人困惑。您必须使用
main()的版本,但它们是不同的——为什么第一个有new,而第二个没有?无论如何,鉴于您只是在普通的空闲存储上而不是在映射的内存中分配节点,因此您的代码不太可能按照您的想法进行。
标签: c++ segmentation-fault mmap