向量:: 擦除分段错误

Posted

技术标签:

【中文标题】向量:: 擦除分段错误【英文标题】:Vector:: erase segmentation fault 【发布时间】:2012-09-05 15:44:57 【问题描述】:

我在这段代码中遇到了分段错误,我不知道为什么:

vector <double> *point;
for (int i = 0; i < point->size(); i += 3) 
    for (int j = i + 3; j < point->size(); j += 3) 
        if (distance((*point)[i], (*point)[i + 1],(*point)[i + 2], (*point)[j],(*point)[j + 1], (*point)[j + 2]) < treshold)
             point->erase(point->begin() + j, point->begin() + j * 3);
             j -= 3;
        
    

point 是点坐标的向量,类似于 (x1,y1,z1,x2,y2,z3,...,xn,yn,zn)。 距离它是一个计算给定 6 坐标的 2 点之间的欧几里得距离的函数。 基本上我会做的是“如果两点彼此太近,删除其中一个”。 但我得到分段错误。 有什么想法吗?

【问题讨论】:

不,point 不是向量,它是一个指向向量的指针。它指向什么? 这段代码究竟是在哪里发生了分段错误? 为什么每个系列3个doubles都算一个点?为什么没有vectorcoordinates,每个coordinate 有3 个问题? 对不起,我的错。初始化向量的指针,这只是我的代码的摘录。事实上,如果我在这个循环之前计算出大小,它就可以工作。我使用双精度向量而不是坐标向量的原因是因为我使用的库需要双精度向量。 【参考方案1】:

erase 行是错误的。你可能是指j + 3,但你有j * 3

【讨论】:

【参考方案2】:
vector <double> *point;

声明一个您尝试使用point-&gt;size() 访问的未初始化指针。

因此,未定义的行为和崩溃。

我会选择一个简单的对象

vector <double> point;

或者,如果你必须使用动态内存:

vector <double> *point = new vector<double>;

【讨论】:

我假设它实际上已经初始化或者他可能已经注意到了,而 Brangdon 的回答才是真正的问题。 @MooingDuck 我承认我没看那么远 :)

以上是关于向量:: 擦除分段错误的主要内容,如果未能解决你的问题,请参考以下文章

分段错误:在 C++ 中弹出向量时出现 11

在 C++ 中使用向量时出现分段错误

带有向量和字符串的 C++ 分段错误

对 2D 或 3D 向量使用擦除删除习语

对向量使用 Push Back 功能时的分段错误

对检索到的向量进行操作时出现分段错误