Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;难以捉摸的分段断层_C++_Class_Pointers_Segmentation Fault - Fatal编程技术网

C++ c++;难以捉摸的分段断层

C++ c++;难以捉摸的分段断层,c++,class,pointers,segmentation-fault,C++,Class,Pointers,Segmentation Fault,我正在编写这段代码,但我一直遇到一个分段错误。就我的一生而言,我不明白为什么,我知道分段错误是当你试图跟随一个空指针时,但问题是,在我的代码中,“u->previous”不是空的,“u”也不是空的,我检查过了。如果我将while循环中的条件更改为(u!=NULL),它将迭代两次,然后在“u->isGreen”上出错,我再次检查每个迭代以查看u是否为NULL int extractOptimalPath() { Node *u = nodes[NUM_NODES - 1]; in

我正在编写这段代码,但我一直遇到一个分段错误。就我的一生而言,我不明白为什么,我知道分段错误是当你试图跟随一个空指针时,但问题是,在我的代码中,“u->previous”不是空的,“u”也不是空的,我检查过了。如果我将while循环中的条件更改为(u!=NULL),它将迭代两次,然后在“u->isGreen”上出错,我再次检查每个迭代以查看u是否为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;
}

seg故障的原因可能是什么?

该错误不仅仅针对空指针,它是指向任何无效对象的指针。这可以是null,但也可以是释放的内存。

我在节点中没有看到复制构造函数,但我看到了指针和析构函数。所以你违反了法律

因此,如果您不小心复制了一个节点,该副本的析构函数将产生您现在看到的效果

更新: 要对此进行快速测试,请向节点类添加一个私有副本构造函数,如下所示:

class Node {
...

private:
  Node(const Node&);
};

如果您现在遇到编译器错误,则是在复制。编译器将向您指出发生这种情况的位置。

您不需要使用空指针来产生分段错误,每次访问超出允许范围的内存时都会发生这种情况。检查螺纹


您的代码不足以说明segfault的原因。在一个节点中,最有可能的
u->previous
指向内存中某个或多或少的随机位置,但这只是一个猜测。

我的猜测是,在节点对象的构造函数中,上一个指针在任何点上都不会设置为NULL。当previous设置为NULL时,应该有一个点(在实际代码中,不要假设代码自动为您执行此操作)。另外,作为提示,尝试使用。另一个技巧,通常用于查询内存泄漏,但我也用它成功地查明了SEGFULTS

您还应该包括
节点
类的实现。
extractOptimalPath()
extractOptimalPath(Node*graph[])之间的关系是什么?您使用过调试器吗?它可能有助于了解
u
到底指的是什么(仅仅知道它不是
0
)是不够的。啊,我只是在测试,我把它移出了类定义。如果你在一个支持它的平台上,通过
valgrind
运行您的代码。其他原因可能包括节点被恶意写入损坏或使用未正确初始化的节点。我认为您关于它是已释放内存的说法是正确的。(对它进行了调试)需要做些什么来阻止它被释放?@Matt:没有释放它。使用智能指针和RAII,并遵循三个规则(所有这些都在SO、维基百科和其他地方有很好的记录)
class Node {
...

private:
  Node(const Node&);
};