【发布时间】:2013-07-17 20:16:19
【问题描述】:
我在 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);
删除它后,一切正常。
【问题讨论】:
-
在调试器或 valgrind 中查看您到达这些数组或向量之外的哪一行。
-
能看到积分的声明吗?和距离?
-
只是让你知道,在这两种情况下你都可能有一个错误。 Eclipse 并不神奇,它只是可能会给你更大的内存空间,这样超出数组边界就不会导致段错误。
-
“如何避免段错误”的实际答案。 1)使用智能指针(对于您的点 a 和 b)或实例,避免使用像瘟疫这样的愚蠢指针。 2)使用向量而不是新的数组(或者如果你觉得很花哨,可以使用 std::array )。 3. 遵循 3 规则(c++11 为 5 规则或 0 规则)。
-
@asriraman93 向我们展示如何创建这些向量和节点。