我寫了一個很小的可觀察的的實現。當一個觀察者註冊時,它刪除舊的觀察者並使新的觀察者進入。但是,即使它沒有被初始化,它也會嘗試刪除指針。代碼如下:「如果(指針)刪除ponter」即使在指針未初始化時也要刪除
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
,聲明如果(myObserver)評估爲true。這導致未初始化的指針被刪除並出現seg錯誤。
值得注意的是,如果我運行發佈版本,我不會收到段錯誤。我只在調試版本中出現錯誤。
我的印象是,如果(myObserver)只評估爲真如果指針是完整的。 (即初始化和未刪除)。
由於其他原因,您正在收到段錯誤。 **已經** **做了一個'nullptr'檢查。 'if(ptr)delete ptr'與'delete ptr'完全相同。 – Yuushi
右鍵:未初始化與初始化爲0不一樣。該測試從不需要。 –