C++;代码:这有什么错? 我编写了一个简单的C++程序,用邻接表实现图形。我的程序如下。我使用向量,其中每个索引是一个顶点。向量中的每个槽存储指向Edge_obj的指针,Edge_obj是邻接列表中链接列表的对象

C++;代码:这有什么错? 我编写了一个简单的C++程序,用邻接表实现图形。我的程序如下。我使用向量,其中每个索引是一个顶点。向量中的每个槽存储指向Edge_obj的指针,Edge_obj是邻接列表中链接列表的对象,c++,c++11,C++,C++11,但是当我使用print_graph()打印图的第一条边时,我得到- 0-->2087138040 我期望0-->3 以下代码有什么问题 #include<iostream> #include<vector> #include <forward_list> using namespace::std; class Edge_obj { public: int V; Edge_obj* next; Edge_obj(int V, Edge

但是当我使用print_graph()打印图的第一条边时,我得到-

0-->2087138040

我期望0-->3

以下代码有什么问题

#include<iostream>
#include<vector>
#include <forward_list>

using namespace::std;

class Edge_obj {
public:
    int V;
    Edge_obj* next;
    Edge_obj(int V, Edge_obj* next);
};

Edge_obj::Edge_obj(int V, Edge_obj* next):V(V),next(next) {}

class Graph {
public:
    int V;
    vector< Edge_obj* > VC;

    Graph(int v);
    void add_edge(int v1, int v2);
    void print_graph ();
};

Graph::Graph(int v):V(v),VC(v,nullptr) {}

void Graph::add_edge(int v1, int v2) {
    Edge_obj obj (v2, VC[v1]);
    VC[v1] = &obj;
}

void Graph::print_graph() {
    cout<<"0-->"<<VC[0]->V;
}


int main()
{
    Graph oho(4);
    oho.add_edge(0,1);
    oho.add_edge(0,2);
    oho.add_edge(0,3);
    oho.print_graph();

    return 0;

}
#包括
#包括
#包括
使用namespace::std;
类边_obj{
公众:
INTV;
边_obj*下一步;
边缘对象(int V,边缘对象*下一个);
};
边obj::边obj(intv,边obj*next):V(V),next(next){
类图{
公众:
INTV;
向量VC;
图形(INTV);
无效添加_边(int v1,int v2);
void print_图();
};
Graph::Graph(intv):v(v),VC(v,nullptr){
无效图::添加边(int v1,int v2){
边_obj obj(v2,VC[v1]);
VC[v1]=&obj;
}
void Graph::print_Graph(){

无法您的VC存储本地对象指针,这将导致未定义的行为

您可以尝试通过以下方式进行修复:

VC[v1] = new Edge_obj(v2, VC[v1]);

或者其他。请注意,您应该在使用后删除它。或者您可以使用智能指针,如
unique\ptr
进行内存管理。

感谢Ron的上述评论

问题就在这里:

void Graph::add_edge(int v1, int v2) {
    Edge_obj obj (v2, VC[v1]);
    VC[v1] = &obj;
}
obj是本地的,其作用域仅限于函数调用。函数调用完成后,它将被销毁,指针悬空

因此,我改进了代码,使用了不受范围限制的new和memory分配

void Graph::add_edge(int v1, int v2) {
    Edge_obj* local = new  Edge_obj(v2, VC[v1]);
    VC[v1] = local;
}

您的VC存储本地对象指针,这会导致未定义的行为。@非常感谢!!解决了。