1

このコードで segfault が発生する理由がよくわかりません。作成したいオブジェクト ポインターの配列があります。これが私のコードです。

   edge **test = new edge*[a]; //Edge is a predefined class I have created. a is a my size of my array.
   graphCreate2(test, vertices, roads, a); //Note roads is an edge class I have already created also

しかし、edge ** test の要素にアクセスしようとすると、segfault が発生します。ここに私がアクセスした方法があります。

void graphCreate2(edge **test, int vertices, edge *roads, int a)
{
  for(int i = 0; i < a; i++)
  {
    e[i]->setEdgeSrc(roads[i].getEdgeSrc());
    e[i]->setEdgeDes(roads[i].getEdgeDes());
    e[i]->setLength(roads[i].getLength());
    cout << e[i]->getLength() << " " << e[i]->getEdgeSrc() << " " << endl;
  }
}

このセグメンテーション違反が発生する理由を誰かが知っているでしょうか? 配列を作成するときにコンストラクターが呼び出されるため、メモリを割り当てたと思いましたありがとう!

4

1 に答える 1

3

コンストラクターは、ごとに呼び出されませんedge。ポインタの配列を作成しているだけですが、それらはガベージを指しています。

それらすべてをループで作成する必要があります。

void graphCreate2(edge **test, int vertices, edge *roads, int a)
{
  for(int i = 0; i < a; i++)
  {
    test[i] = new edge();  // create the edge
    test[i]->setEdgeSrc(roads[i].getEdgeSrc());
    test[i]->setEdgeDes(roads[i].getEdgeDes());
    test[i]->setLength(roads[i].getLength());
    cout << test[i]->getLength() << " " << test[i]->getEdgeSrc() << " " << endl;
  }
}
于 2012-11-18T19:09:49.520 に答える