C ++代码:这有什么问题?

时间:2015-04-07 01:34:43

标签: c++ c++11

我正在编写一个简单的C ++程序来使用邻接列表来实现图形。我的节目如下。我正在使用vector,其中每个索引都是一个顶点。向量中的每个槽存储指向Edge_obj的指针,Edge_obj是邻接列表中链接列表的对象。

但是当我使用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;

}

2 个答案:

答案 0 :(得分:1)

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

您可以尝试通过这种方式修复:

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

或其他。请注意,使用后您应该delete。或者您可以使用unique_ptr等智能指针进行内存管理。

答案 1 :(得分:1)

感谢上面Ron的评论。

问题在于:

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

obj是本地的,其范围仅限于函数调用。在函数调用完成后,它将被破坏而指针悬空。

所以我通过使用不受范围限制的新内存分配来改进代码。

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