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