0xfeeefeee分段错误,但简单的分配更改?

时间:2014-05-08 20:13:55

标签: c++ segmentation-fault fault

我正在实施Barnes-Hut模拟程序,并提供以下简短的代码片段:

BhTree *BhTree::make() {
    return new BhTree();
}

其余代码(实质性)然后效果很好。在程序生命周期中,创建的节点从不被删除。使用这个事实,我想通过使用这个来优化分配:

vector<BhTree> mSpace;
BhTree *BhTree::make() {
    mSpace.push_back(BhTree());
    return &mSpace[mSpace.size()-1];
}

这会在代码的不相关部分导致可怕的分段错误。有趣的是,在递归函数中,this突然转换为0xfeeefeee,这是用于堆释放内存的Microsoft代码。

任何人都可以看到问题可能是什么?向量mSpace 永远不会在其他位置访问。

3 个答案:

答案 0 :(得分:2)

随着std::vector的增长,它会为其内容重新分配内存,并使您分发的所有先前指针无效。

答案 1 :(得分:2)

您正在返回指向由向量管理的对象的指针:

&mSpace[mSpace.size()-1];

一旦向量扩展了内部缓冲区,地址就会无效,并将对象复制到新位置。

您有3个选项:

  • 更改所有代码,以按值/引用而不是指针传递对象
  • 改为使用向量存储std::shared_ptr<Bhtree>(如果您的编译器支持C ++ 11)。
  • 制作向量存储Bhtree*并确保delete每个元素

第二个变体看起来像这样:

std::vector<std::shared_ptr<Bhtree>> mSpace;

BhTree *BhTree::make() {
    mSpace.push_back(std::make_shared<BhTree>());
    return mSpace.back().get();
}

答案 2 :(得分:1)

mSpace.push_back()可以在确定它没有空间时调整向量内部数组的大小。发生这种情况时,向量的内部数组变为无效,向量元素的旧指针也无效。