推送到成员向量时的Segfault

zed*_*dex 2 c++ vector segmentation-fault push-back

这是一个相对较小但是细分的项目.我搜索了很多做类似事情的帖子,虽然很多帖子似乎都有同样的问题,但没有一个能解决我的问题.

基本问题是:我有一个myGraph带有成员向量的对象()和一些方法.另一个类中myGraph的方法调用其中一个方法,而这些方法又调用另一个方法.在函数内部,推送到一个int的向量myGraph.但是,这种推动会导致段错误.

在一个极端的衡量标准中,我一直在评论大部分代码(当然是在一个新的分支上),并将我的代码减少到稀疏的几个项目.(其他帖子似乎表明这种事情可能是由其他地方的错误代码引起的)但我仍然遇到了段错误.

以下是淡化文件,由尚未注释的少数内容组成.我说"淡化"因为很多声明(现在是空函数等)已被删除.如果您需要其他信息(例如,如果重要 - 不知何故 - 我在某处使用虚拟功能......作为一个激进的例子)请告诉我.

在Dispatcher.h中:

class myGraph;

class CDispatcher
{
public:
    CDispatcher(void);
    ~CDispatcher(void);

    void ProcessCall(string buf);

    myGraph* mymap;

};
Run Code Online (Sandbox Code Playgroud)

在Dispatcher.cpp中:

void CDispatcher::ProcessCall(string buf) 
{
    mymap->getDistance(0,1);
};
Run Code Online (Sandbox Code Playgroud)

在mygraph.cpp中:

int myGraph::getDistance(int start, int end) {
    Dijkstras(start,end);

    // This is just to return something
    return 5;
};

vector<int> myGraph::Dijkstras(int startVert,int endVert) {

    vertices_i.push_back(2); // This line results in a segfault
    cout << "push successful" << endl;

    // This is just to return something
    vector<int> unvisited;
    return unvisited;
};
Run Code Online (Sandbox Code Playgroud)

mygraph.h:

typedef struct edge
{
    int endVert;
    int weight;
} edge;


typedef struct vertex
{
    long dist;
    bool visited;
    int prev;

    vector<edge> edges;
} vertex;
class myGraph
{
public:
    myGraph(int initSize);
    ~myGraph(void);

    int getDistance(int start, int end);
    vector<int> Dijkstras(int startVert,int endVert);

    //vector<vertex> vertices; // The original vector that was segfaulting
    vector<int> vertices_i; // Simpler vector, of just ints. Still segfaults

};
Run Code Online (Sandbox Code Playgroud)

Ern*_*ill 5

不可避免的结论是成员指针myGraph* mymap指向垃圾; 你显然忽略了将它初始化为指向一个myGraph物体.你需要创建一个对象,以便在CDispatcher构造函数中引用它- 即,

CDispatcher(void) : mymap(new myGraph(1)) {}
Run Code Online (Sandbox Code Playgroud)