0xfeeeee分段错误,只是简单的分配改变

0xfeeefeee segmentation fault, but simple allocation change?

本文关键字:简单 分配 改变 分段 错误 0xfeeeee      更新时间:2023-10-16

我正在实现一个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代码用于堆释放内存。

有谁能马上看出问题是什么吗?vector mSpace 不能在别处访问

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

你正在返回一个指向由vector管理的对象的指针:

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

一旦vector扩展了它的内部缓冲区,并将对象复制到一个新的位置,该地址就会失效。

你有3个选项:

  • 更改所有代码,通过值/引用而不是指针传递对象
  • 将vector store改为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();
}

mSpace.push_back()可以在确定空间不足时调整vector内部数组的大小。当这种情况发生时,vector的内部数组失效,指向vector元素的旧指针也失效。