条件跳转或移动取决于未初始化的值和分割错误
Conditional jump or move depends on uninitialised value(s) and Segmentation fault
我正在使用ANN库(kdtree),我有一个创建和销毁这些对象的问题:
这是我的构造函数:myKdtree::myKdtree(vector<Point*> *P){
int nnPts = P->size();
dataPts = annAllocPts(P->size(), DIM);
for (int i = 0; i < P->size(); ++i) {
dataPts[i][0] = P->at(i)->getX();
dataPts[i][1] = P->at(i)->getY();
dataPts[i][2] = P->at(i)->getZ();
i++;
}
kdTree = new ANNkd_tree(dataPts, nnPts, DIM);
}
其中dataPts
为ANNpointArray
, kdTree
为ANNkd_tree*
,均来自ANN库。
析构函数:
myKdtree::~myKdtree(){
annDeallocPts(dataPts);
delete kdTree;
annClose();
}
我创建了一个kdtree,并使用它(查找NN和更多操作)。在程序的某些部分,我必须销毁kdtree并重新创建它:
void ElementSet::update(){
if(dataStruct!=NULL) delete dataStruct;
dataStruct = new myKdtree(allpoints);
calcMMD();
}
其中dataStruct
是抽象对象IDataStructure
实例化为myKdtree
对象。
第一个创建的Kdtree运行良好。但是,当我删除它并重新创建它时,出现分割故障。我可以"解决"这个分割错误,从~myKdtree()
中删除annDeallocPts(dataPts)
。然而,我认为这不是正确的解决方案。我应该能够完全删除第一个对象,并再次创建它。不是吗?
此外,有或没有annDeallocPts(dataPts)
, Valgrind总是显示错误Conditional jump or move depends on uninitialised value(s)
位于kdTree = new ANNkd_tree(dataPts, nnPts, DIM);
,在myKdtree()
构造函数。
我在其他帖子中寻找解决方案,但我找不到:(.
你能帮我吗?
谢谢!: D
您在构造函数的循环中增加了两次i
,因此并不是所有数据都将被初始化,因为您跳过了每第二个条目。这将导致未定义的行为如果您从dataPts
中未初始化的条目中读取未初始化的(和不确定的)数据。未定义行为是导致分段错误的常见原因。
相关文章:
- C++映射分割错误(核心转储)
- 由cin中的字符串中未捕获空白引起的分割错误
- 删除映射和分割错误中的一个过去结束元素
- 在指向函数中读取变量时出现分割错误
- 在链表中的第 n 位插入显示分割错误
- 较高值 n 的分割错误(例如 n=999997)
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 分割错误:向量中的擦除功能
- 向量向量的分割错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 分割错误 11:尝试使用 cin 输入 B[1] 时
- 集合布局上的 Qt 分割错误
- 高达20亿的筛子会产生分割错误
- 对向量使用推回函数时的分割错误
- 绘制精灵会导致分割错误
- 将矢量的整数内容打印为字符串会导致分割错误
- 分割错误:使用向量时为 11 c++
- 结构的分割错误错误