这就是我定义图表的方式。这不是一个典型的图表,它特定于我正在处理的问题类型。
class Vertex;
class Edge
{
public:
Vertex *org;
Vertex *dest;
bool dir;
};
struct Vertex{
int id;
vector<Edge> edges;
int weight;
};
struct Graph{
vector<Vertex> vertices;
};
我在图中添加顶点时遇到问题。这就是我在做的事情
Graph* graph1;
Vertex* first = addVertex(0);
graph1->vertices.push_back(*first);
addVertex函数工作正常,但是如果你还想引用,那么它就是
Vertex* addVertex(int id){
Vertex*newVertex = new Vertex;
newVertex->id=id;
newVertex->weight=0;
return newVertex;
}
该函数在graph1-&gt; vertices.push_back(* first)之前停止工作;
答案 0 :(得分:2)
graph1
本身是一个统一指针。因此,调用它的成员会导致程序崩溃。使用new
运算符初始化它。
graph1 = new Graph();
// .......
delete graph1;
或者使用像std::unique_ptr
这样的智能指针来自动管理内存。
答案 1 :(得分:0)
除了未初始化的Graph* graph1
之外,您的代码中还存在另一个内存管理问题:
addVertex
在其自己的堆内存块中分配单个Vertex
。但是接下来
graph1->vertices.push_back(*first);
将 first
复制到graph1
的{{1}}管理的内存块中。
我想你是来自Java或Python等其他语言的C ++新手。你应该阅读一本介绍性的C ++书。与其他语言相比,C ++中的内存管理存在许多陷阱和概念需要跟踪。