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

Conditional jump or move depends on uninitialised value(s) and Segmentation fault

本文关键字:分割 错误 初始化 移动 取决于 条件      更新时间:2023-10-16

我正在使用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);
}

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