C++ C++;代码片段中的分段错误

C++ C++;代码片段中的分段错误,c++,segmentation-fault,C++,Segmentation Fault,我在Eclipse中测试了我的代码,一切都很好——我现在从终端运行这个项目,并且不断遇到分段错误。我已将问题缩小到这一部分: [此代码使用节点指针向量构造距离矩阵。] for(unsigned int j=0;j<numPts;j++) { for(unsigned int k=j+1;k<numPts;k++) { Node* a = points[j]; Node* b = points[k]; double xd

我在Eclipse中测试了我的代码,一切都很好——我现在从终端运行这个项目,并且不断遇到分段错误。我已将问题缩小到这一部分:

[此代码使用节点指针向量构造距离矩阵。]

for(unsigned int j=0;j<numPts;j++) {
     for(unsigned int k=j+1;k<numPts;k++) {
         Node* a = points[j];
         Node* b = points[k];
         double xd = a->GetX()- b->GetX();
         double yd = a->GetY() - b->GetY();

        unsigned int dab = int(round(sqrt(xd*xd + yd*yd)));
        (*distances)[(int)j][(int)k] = dab;
        (*distances)[(int)k][(int)j] = dab;
      }
}
[编辑3]-这是我实现节点的方式:

#include <utility> 
class Node : public std::pair<double, double> 
{ 
public: 
        Node(double x, double y) : std::pair<double, double>(x,y) 
        {} 

        double GetY() const {return second;} 
        double GetX() const {return first;} 

}; 
#包括
类节点:公共std::pair
{ 
公众:
节点(双x,双y):标准::对(x,y)
{} 
双GetY()常量{return second;}
double GetX()常量{return first;}
}; 

所以我解决了问题。。。myVec[0]上的指针不是NULL,但在某种程度上已损坏。我在向量的开头“插入”了一个元素,这导致了所有的bug:

std::vector<Node*>::iterator it;
it = myVec.begin();
myVec.insert(it, newNodePtr);
std::vector::iterator;
it=myVec.begin();
myVec.insert(it,newNodePtr);

一旦我把它去掉,一切都正常了

如果该区域确实是故障的原因,请检查:

Node* a = points[j];
Node* b = points[k];
对于
NULL
或错误指针值,在尝试取消引用之前

另外,确保
distance
不为空,并且在第二次赋值中也是一个有效指针,并且j和k作为二维偏移量指向实际
距离
缓冲区,而不是超出它(确保
numPts
确实是要用作缓冲区端点的。)

如果您不能
如果
它们,那么至少
断言它们

来自您的编辑


我文章的第一部分应用了-
a
和/或
b
几乎肯定是坏的或
NULL
指针,这导致了崩溃。查看您如何将内存分配给该数组/容器/无论它是什么,或检查它是否存在内存损坏。

查看调试器或valgrind,查看您到达这些数组或向量之外的哪一行。我们可以查看点的声明吗?距离呢?正如你所知,你可能在这两种情况下都有缺陷。Eclipse并不神奇,它可能会给你更大的内存空间,这样超限的数组边界就不会导致segfault。这是“如何避免segfault”的一个实际答案。1) 使用智能指针(针对a点和b点)或实例,避免使用类似瘟疫的哑指针。2) 使用向量而不是新的数组(或者std::array,如果您觉得非常合适的话)。3.遵循规则3(对于c++11,规则5或规则0)。@asriraman93向我们展示了如何创建这些向量和节点。我确保指针不为空,因此我猜它们一定是“坏的”。如何以更好的方式创建指针向量,以便以后能够访问它们?
Node* a = points[j];
Node* b = points[k];