<分区>
我写了一个非常小的 Observeable 实现。当一个观察者被注册时,它会删除旧的观察者并安装新的观察者。但是它会尝试删除指针,即使它尚未初始化。代码如下:
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) 的计算结果为 < em>是的。这会导致未初始化的指针被删除和段错误。
值得注意的是,如果我运行发布版本,我不会遇到段错误。我只在调试版本中得到错误。
我的印象是,if(myObserver) 只有在指针完好无损的情况下才会评估为 true。 (即已初始化且未删除)。