我写了一个非常小的Observable实现。当观察者注册时,它会删除旧的观察者并设置新的观察者。但是,即使指针尚未初始化,它也会尝试删除指针。代码如下:
可观察的.h
class Observable
{
public:
Observable();
virtual void registerObserver(Observer * O);
virtual ~Observable();
protected:
Observer * myObserver;
};
可观察的.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。这会导致未初始化的指针被删除和段错误。
值得注意的是,如果我运行发布版本,我不会遇到段错误。我只在调试版本中得到错误。
我的印象是if(myObserver)只有在指针完好无损的情况下才会评估为真。(即已初始化且未删除)。