私は非常に小さなObservable実装を書きました。オブザーバーが登録されると、古いオブザーバーが削除され、新しいオブザーバーが作成されます。ただし、初期化されていない場合でも、ポインターを削除しようとします。コードは次のとおりです。
Observable.h
class Observable
{
public:
Observable();
virtual void registerObserver(Observer * O);
virtual ~Observable();
protected:
Observer * myObserver;
};
Observable.cpp
#include "Observable.h"
Observable::Observable()
{
}
Observable::~Observable()
{
if(myObserver)
delete myObserver;
}
void Observable::registerObserver(Observer * O)
{
if(myObserver)
delete myObserver;
myObserver=O;
}
すべての主な機能は
GUI * gui = new GUI(); // GUI extends Observer
Model * m = new Model(); //Model extends Observable
m->registerObserver(gui); //I get a segfault inside this call
をステップ実行するregisterObserver
と、 を初期化していなくてもmyObserver
、ステートメントif(myObserver)がtrueと評価されることがわかります。これにより、初期化されていないポインターが削除され、セグ フォールトが発生します。
リリース ビルドを実行すると、segfault が発生しないことに注意してください。デバッグビルドでのみエラーが発生します。
if(myObserver)は、ポインターが無傷の場合にのみtrueと評価されるという印象を受けました。(つまり、初期化され、削除されていません)。