0

我在 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;
      }
}

如何修复这段代码,以免出现任何分段错误?

[编辑] - 它崩溃的那条线就是那条double xd = a->GetX() - b->GetX();线。

[编辑 2] - 这就是我创建矢量的方式:

std::vector<Node*> myVec;
Node* p1 = new Node(xval, yval);
myVec.push_back(p1);

[编辑 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;} 

}; 

所以我发现了问题...... myVec[0] 的指针不是NULL,但它在某种程度上被破坏了。我在向量的开头“插入”了一个元素,这导致了所有错误:

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

一旦我删除它,一切正常。

4

1 回答 1

0

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

Node* a = points[j];
Node* b = points[k];

NULL尝试取消引用它们之前的 for或 bad 指针值,

此外,请确保distances它是非 NULL 并且在您的第二次分配中也是一个有效指针,并且 j 和 k 作为二维偏移量指向实际distances缓冲区而不是超出它(确保这numPts确实是您要用作缓冲区的意思端点。)

如果你不能if他们,那么至少assert他们。

从您的编辑

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

于 2013-07-17T21:07:38.573 回答