0xfeeeee分段错误,只是简单的分配改变
0xfeeefeee segmentation fault, but simple allocation change?
我正在实现一个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元素的旧指针也失效。
相关文章:
- 将数组的地址分配给变量并删除
- 在c++中用vector填充一个简单的动态数组
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 将字符从一个字符串简单分配到另一个字符串不起作用
- 特征库,简单的线性代数操作,具有稀疏的矩阵,增加了其分配的尺寸
- 简单的字符串分配导致分割故障
- 一个简单的向量,如何正确重新分配新数组的地址
- 指针;数组的简单分配
- c ++新的C数组分配,RAII或简单的shared_ptr/boost::shared_array
- 通过为每个字母分配(新)值在简单加密中使用数组
- 视觉对象C++窗体、简单消息框和将文本从文本字段分配给字符串时出错
- 在Win/Linux上使用C/C++分配内存的最简单方法是什么
- 给我的程序分配图标最简单的方法是什么
- 简单的数组内存分配与大小动态分配和预定的大小
- Try/catch块用于在构造函数内部将简单内存分配到公共原始指针
- 我可以简单地在分配的内存上调用构造函数,而不是放置new
- 0xfeeeee分段错误,只是简单的分配改变
- 有没有一种简单的方法来分配结构数组
- 如何简单地分配不同结构的向量