我正在实施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
永远不会在其他位置访问。
答案 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()可以在确定它没有空间时调整向量内部数组的大小。发生这种情况时,向量的内部数组变为无效,向量元素的旧指针也无效。