条件跳转或移动取决于未初始化的值和分段错误
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 效果很好。但是,当我删除它并重新创建它时,会发生 Segmentation Fault。我可以 "solve" 这个分段错误从 ~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
中未初始化的条目中读取未初始化(和不确定的)数据,这将导致 未定义的行为 。未定义的行为是分段错误的常见原因。
我正在使用 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 效果很好。但是,当我删除它并重新创建它时,会发生 Segmentation Fault。我可以 "solve" 这个分段错误从 ~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
中未初始化的条目中读取未初始化(和不确定的)数据,这将导致 未定义的行为 。未定义的行为是分段错误的常见原因。