zedadex
zedadex

Reputation: 35

Segfault when pushing to member vector

Here's a relatively small but segfaulting project. I've searched quite a few posts doing similar things and while many seemed to be having the same problem, none solved my problem.

The basic issue is this: I have an object (myGraph) with a member vector, and a few methods. A method inside another class invokes one of myGraph's methods, which in turn invokes another one. Inside that function, a push is made to a vector of ints in myGraph. However, this push results in a segfault.

In a somewhat extreme measure, I've been commenting out large portions of code (on a fresh branch of course) and have reduced my code down to a sparse few items. (other posts seemed to indicate that this kind of thing might be caused by bad code elsewhere) yet I am still getting a segfault.

What follow are the watered-down files, composed of the few things remaining uncommented. I say "watered-down" because a lot of declarations (of now-empty functions and such) have been removed. If you need additional information (for instance, if it's important - somehow - that I'm using a virtual function somewhere... as a radical example) just let me know.

in Dispatcher.h:

class myGraph;

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

    void ProcessCall(string buf);

    myGraph* mymap;

};

in Dispatcher.cpp:

void CDispatcher::ProcessCall(string buf) 
{
    mymap->getDistance(0,1);
};

in 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;
};

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

};

Upvotes: 2

Views: 4815

Answers (1)

Ernest Friedman-Hill
Ernest Friedman-Hill

Reputation: 81684

The unavoidable conclusion is that the member pointer myGraph* mymap is pointing to garbage; you've apparently neglected to initialize it to point to a myGraph object. You need to create an object for it to refer to in the CDispatcher constructor -- i.e.,

CDispatcher(void) : mymap(new myGraph(1)) {}

Upvotes: 5

Related Questions