我正在处理这段代码,并且我一直遇到分段错误。对于我的生活,我无法弄清楚为什么,我知道一个分段错误是当你尝试遵循空指针,但问题是,在我的代码“u-> previous”isnt null,也不是“u”,我检查了。如果我将while循环中的条件更改为(u!= NULL),它将在出现“u-> isGreen”之前迭代两次,再一次,我检查每次迭代以查看是否为null。
int extractOptimalPath() {
Node *u = nodes[NUM_NODES - 1];
int i = 0;
while (u != NULL) {
cout << i << endl;
u->isGreen = true;
u = u->previous;
i++;
}
return 0;
}
“nodes”是指向实际Node对象的指针数组。我确定我的节点中存在“u-&gt; previous”并且“isGreen”被初始化为false;
继承Node类,以防你想看到:
class Node {
public:
GLfloat x, y, z;
int numLinks;
Node *link1;
Node *link2;
GLfloat distance;
Node *previous;
bool isGreen;
Node(GLfloat x, GLfloat y, Node *link1, Node *link2);
Node(GLfloat x, GLfloat y, Node *link1);
Node();
Node(GLfloat x, GLfloat y);
~Node();
bool dijkstra(Node* graph[], Node *source, Node *target); //returns true if a path to target is found
int dist(Node *n1, Node *n2);
int extractOptimalPath(Node* graph[]);
};
可能导致seg故障的原因是什么?
答案 0 :(得分:7)
对于空指针,该错误不是 ,它是一个指向任何无效指针的指针。这可以是null,但它也可以是被释放的内存。
答案 1 :(得分:4)
我在Node中看不到复制构造函数,而我看到指针和析构函数。所以你违反了Rule of Three。
因此,如果您意外复制节点,该副本的析构函数将产生您现在看到的效果。
<强>更新强> 要快速测试,请在Node类中添加一个私有拷贝构造函数,如下所示:
class Node {
...
private:
Node(const Node&);
};
如果您现在遇到编译器错误,那么您正在制作副本。编译器会指出发生这种情况的位置。
答案 2 :(得分:0)
您不需要具有NULL指针来进行分段错误,每次从允许的范围内访问内存时都会发生这种情况。检查帖子What is a segmentation fault?。
您的代码不足以说明导致段错误的原因。很可能你的一个节点中的u->previous
指向内存中或多或少随机的位置,但这只是猜测。
答案 3 :(得分:0)
我的猜测是,在Node对象的构造函数中,前一个指针在任何时候都不会设置为NULL。当previous设置为NULL时,您应该有一个点(在您的实际代码中,不要假设代码会自动为您执行此操作)。另外,作为提示,请尝试使用gdb to step through your code。另一个提示valgrind通常用于查询内存泄漏,但我也用它来成功查明段错误。