条件跳转或移动取决于未初始化的值和分段错误

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 是一个 ANNpointArraykdTreeANNkd_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 中未初始化的条目中读取未初始化(和不确定的)数据,这将导致 未定义的行为 。未定义的行为是分段错误的常见原因。