2

これは比較的小さいがセグメンテーション違反のあるプロジェクトです。同様のことをしているかなりの数の投稿を検索しましたが、多くの人が同じ問題を抱えているように見えましたが、私の問題を解決したものはありませんでした.

myGraph基本的な問題は次のとおりです。メンバ ベクトルを持つオブジェクト ( ) と、いくつかのメソッドがあります。別のクラス内のメソッドが のメソッドの 1 つを呼び出し、そのメソッドが別myGraphのメソッドを呼び出します。その関数内で、 int のベクトルに対してプッシュが行われますmyGraph。ただし、このプッシュによりセグメンテーション違反が発生します。

やや極端な方法として、コードの大部分を (もちろん新しいブランチで) コメントアウトし、コードをまばらないくつかの項目に減らしました。(他の投稿では、この種のことは他の場所の悪いコードが原因である可能性があることを示しているようです)、まだセグメンテーション違反が発生しています。

以下は、コメントされていない残りのいくつかのもので構成された、骨抜きにされたファイルです。多くの宣言 (現在は空の関数など) が削除されているため、「骨抜きにされた」と言います。追加情報が必要な場合 (たとえば、根本的な例として、どこかで仮想関数を使用していることが重要である場合) は、お知らせください。

Dispatcher.h で:

class myGraph;

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

    void ProcessCall(string buf);

    myGraph* mymap;

};

Dispatcher.cpp で:

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

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

};
4

1 に答える 1

5

避けられない結論は、メンバー ポインターmyGraph* mymapがガベージを指しているということです。オブジェクトを指すように初期化することを怠ったようmyGraphです。コンストラクターで参照するオブジェクトを作成する必要がありますCDispatcher-つまり、

CDispatcher(void) : mymap(new myGraph(1)) {}
于 2012-06-10T05:16:55.957 に答える