我正在尝试用C ++制作图形,但我几乎没有代码,但是出现一些奇怪的错误。如果我只运行代码,则会得到Process finished with exit code 0
,但是如果我看一下调试器(具体地说,我尝试检查我的graph
对象),则会看到Cannot access memory at address 0x...
。
我是C ++的新手,所以我无法真正了解导致此错误的原因。另外,我几乎还没有代码,而我以前的程序中摘录的这几行代码也没有出现问题。
无论如何,我有一个vertex
班:
#ifndef P2_VERTEX_H
#define P2_VERTEX_H
class vertex {
private:
int id;
public:
explicit vertex(int id) { this->id = id; }
int get_id() { return id; }
};
#endif //P2_VERTEX_H
然后是一个graph
标头:
#ifndef P2_GRAPH_H
#define P2_GRAPH_H
#include <vector>
#include "vertex.h"
class graph {
private:
int N; // number of vertices
int M; // number of edges
std::vector<vertex*> vertices; // vector of vertices
std::vector<vertex*> *adj; // ARRAY of vectors of vertices
public:
graph(int n_vert);
graph(bool from_file, const char *file_name);
};
使用graph
的实现:
#include "graph.h"
#include <iostream>
#include <fstream>
#include <sstream>
graph::graph(int n_vert) {
N = n_vert;
}
我将graph
实例化为:
#include "graph.h"
int main() {
graph g = graph(4);
return 0;
}
特别是,如果我在图形标题中取消注释std::vector<vertex*> *adj;
,则会出现此错误。虽然我意识到这可能不是存储邻接表的理想方法,但是我看不到为什么它会给我一个我提到的错误。特别是因为我以前使用过它,所以我有了std::vector<vertex*>
而不是std::vector<edge*>
,其中edge
是struct
。我也试着让std::vector<vertex>
的{{1}}整齐,但我有同样的错误。
已更新:
如果我在构造函数中初始化std::vector<vertex*>
:
adj
到达这一行后,我在调试器中得到adj = new std::vector<vertex*>[N];
。
答案 0 :(得分:0)
问题在于您从未初始化adj
,因此它将指向内存中的随机位置。
您必须初始化指向nullptr
的指针才能删除它。
例如,在构造函数初始化列表中:
graph::graph(int n_vert) : N(n_vert), adj(nullptr)
{}
通过忘记初始化其他字段成员的方式。