我在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;
}
}
如何修复此段代码,以免出现任何Segmentation错误?
[编辑] - 崩溃的行是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);
一旦我删除了,一切正常。
答案 0 :(得分:0)
如果该区域确实是故障的原因,请检查:
Node* a = points[j];
Node* b = points[k];
在尝试取消引用它们之前,表示NULL
或错误的指针值,
另外,确保distances
为非NULL,并且在第二个赋值中也是一个有效指针,j和k作为二维偏移量指向实际的distances
缓冲区而不是它(确保numPts
确实是您用作缓冲区端点的意思。)
如果你不能if
他们,那么至少assert
他们。
来自您的修改
我的帖子的第一部分适用 - a
和/或b
几乎肯定是坏的或NULL
指针,这会导致您的崩溃。了解如何为该阵列/容器/内容分配内存或检查内存是否存在损坏。