c++ - "if(pointer) delete ponter"即使指针未初始化也尝试删除

标签 c++ qt pointers segmentation-fault

<分区>

我写了一个非常小的 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。 (即已初始化且未删除)。

最佳答案

其他人已经解释了为什么您会因为未初始化的指针而出现段错误,以及如何解决这个问题。您还有其他错误等待发生,因为您没有遵循 rule of three .如果您制作了 Observable 类的拷贝,这两个实例现在都将包含 myObserver 的拷贝,并且都将尝试删除它们中的指针各自的析构函数,导致未定义的行为,并可能导致崩溃。

更好的实现是遵循rule of zero而不是自己管理指针。

#include <memory>

class Observable
{
public:
    Observable();
    virtual void registerObserver( std::unique_ptr<Observer> O );
    virtual ~Observable();

protected:
    std::unique_ptr<Observer> myObserver;
};

Observable::Observable()
// no need to initialize pointer
{}

Observable::~Observable()
{
  // no need to delete pointer manually
}

void Observable::registerObserver( std::unique_ptr<Observer> O )
{
    myObserver.reset( O.release() );
}

关于c++ - "if(pointer) delete ponter"即使指针未初始化也尝试删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16952569/

相关文章:

qt - 缺少std::runtime_error in qt+mingw

c - 我如何使用这个库在我的 C 文件中绘制 map ?

c++ - 使用 fscanf 了解循环

qt - 如何在 Ubuntu 18 :04? 上使用 QT5 安装 CGAL

c++ - 用 extern "C"包装一个 C 库,除了一个内部 C++ 包含

c++ - 从 Q_INVOKABLE 函数或插槽中更改 QQuickImage 源

C++ 指针数组为每个元素返回相同的值

objective-c - 如何访问 NSBitmapImageRep 的像素?

C++:简单方程式的问题?

c++ - 两个类可以互相访问吗?