You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:51:49