C++中Graph类verticies.size()值前后不一致导致崩溃问题求助
问题分析与解决
你遇到的崩溃问题根源非常典型——变量遮蔽(Variable Shadowing),也就是构造函数里的局部变量覆盖了类的成员变量。
具体问题点
在Graph的构造函数中,你写了这行代码:
vector<Vertex> verticies;
这会创建一个和类成员变量verticies同名的局部向量。你后续往这个局部向量里添加了4个Vertex对象,构造函数里打印的verticies.size()也是这个局部变量的长度(所以是4),但类的成员变量verticies从头到尾都没有被初始化,始终是空的。
当你调用addEdge方法时,访问的是类的成员变量verticies,它的size是0,执行verticies[fromVertex].addEdge(toVertex)时自然会触发数组越界,导致程序崩溃。
修正后的构造函数
只需要去掉局部变量的定义,直接操作类的成员变量即可:
Graph(int _vertexCount) { this->vertexCount = _vertexCount; // 移除局部的vector<Vertex> verticies;定义 for (size_t i = 0; i < _vertexCount; i++) { Vertex v = Vertex(i); verticies.push_back(v); } cout << "verticies count " << verticies.size() << endl; }
或者用更高效的初始化方式(推荐):
Graph(int _vertexCount) : vertexCount(_vertexCount) { verticies.reserve(_vertexCount); // 预分配内存,提升性能 for (size_t i = 0; i < _vertexCount; i++) { verticies.emplace_back(i); // 直接在向量中构造Vertex对象,避免拷贝 } cout << "verticies count " << verticies.size() << endl; }
额外小提示
你的findPath方法还有一个潜在问题:没有标记节点的访问状态,也没有回溯。比如路径2->0->1找到后,递归返回时不会把1和0的isVisited改回false,这会导致后续无法找到其他可能的路径,甚至可能陷入无限循环(比如2->0->2->0...)。可以在进入递归前标记isVisited = true,递归返回后再设为false来修复这个问题。
内容的提问来源于stack exchange,提问作者Guy Fawkes
相关产品推荐
相关产品推荐

