向量数组上的“无法访问地址处的内存”

时间:2019-10-25 12:37:33

标签: c++

我正在尝试用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*>,其中edgestruct。我也试着让std::vector<vertex>的{​​{1}}整齐,但我有同样的错误。

已更新: 如果我在构造函数中初始化std::vector<vertex*>adj 到达这一行后,我在调试器中得到adj = new std::vector<vertex*>[N];

1 个答案:

答案 0 :(得分:0)

问题在于您从未初始化adj,因此它将指向内存中的随机位置。
您必须初始化指向nullptr的指针才能删除它。

例如,在构造函数初始化列表中:

graph::graph(int n_vert) : N(n_vert), adj(nullptr)
{}

通过忘记初始化其他字段成员的方式。