c ++难以捉摸的分段错误

时间:2011-07-17 20:50:23

标签: c++ class pointers segmentation-fault

我正在处理这段代码,并且我一直遇到分段错误。对于我的生活,我无法弄清楚为什么,我知道一个分段错误是当你尝试遵循空指针,但问题是,在我的代码“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故障的原因是什么?

4 个答案:

答案 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通常用于查询内存泄漏,但我也用它来成功查明段错误。