0

オブジェクトへのポインターを別のオブジェクトのインスタンス内のベクターに追加しようとすると、セグ フォールトが発生します。一度に複数のポインターをベクターに追加していますが、最初のポインターは機能しますが、2 番目の試行ではセグ フォールトが発生し続けます。

class Observer {
  Observer();
  observe();
};

class Subject {
  std::vector<Observer*> *observers;
  std::string name;

  Subject();
  virtual std::string getName();
  virtual void addObserver(Observer *observer) {
    observers->push_back(observer);
  }
};

class Base : public Subject {
  Base(std::string newName) { name = newName; }
};

class Derivative : public Subject, public Observer {
  float a;
  float b;
  float c;
  Derivative(a, b, c) { this->a = a; this->b = b; this->c = c; }

};

class Board : public Base {
   Base *base;

   Board(std::string newName, Base *newBase) { name = newName; base = newBase; }

   void initializeDerivatives(int start, int end) {
     for (int i = start; i <= end; ++i) {
       addObserver(new Derivative(start, start + 1, start + 2)); //works
       base->addObserver(new Derivative(start, start + 1, start + 2)); //THIS WORKS
       addObserver(new Derivative(start, start + 2, start + 3)); //works
       base->addObserver(new Derivative(start, start + 2, start + 3)); //seg fault here
     }
   }
};

int main() {
  Base myBase("MYBASE");
  Board myBoard("MYBASE", myBase);

  myBoard.initializeDerivatives(1, 10);
}

myBoard と myBase をポインターとして宣言したときに、以前にセグ フォールトが発生していました。 Base* myBase = new Base("MYBASE"); Board* myBoard = new Board("MYBASE", myBase);

そして、 new 演算子を使用すると実際にオブジェクトのインスタンスが初期化されると思っていたので、その理由がわかりませんでした。実際のオブジェクトを作成するように変更しても、1 つのポインターをオブザーバー ベクトルに追加することはできますが、2 つ目のポインターは機能しません。何かご意見は?

4

1 に答える 1

1

ではclass Subject、これを次のように変更する必要があります。

std::vector<Observer*> *observers;

これに:

std::vector<Observer*> observers;

ポインターとして、コードはそのポインターがどこでも初期化されていることを示していません。コンストラクタで初期化すると、デストラクタがないため、メモリ リークが発生する可能性がありますSubject

于 2013-03-18T18:41:16.523 に答える