为什么QObject会破坏被破坏的信号?

lam*_*fun 11 c++ qt destructor

考虑这个测试用例:

class MyObject : public QObject
{
    Q_OBJECT
public:
    MyObject() { qDebug() << "MyObject constructor"; }
    virtual ~MyObject() { qDebug() << "MyObject destructor"; }
};

class Tracker : public QObject
{
    Q_OBJECT
public:
    Tracker() {}

public slots:
    void onDestructor() { qDebug() << "About to be destroyed!"; }
};

int main(int argc, char** argv)
{
    QCoreApplication app(argc, argv);

    Tracker tracker;

    MyObject *obj = new MyObject();
    QObject::connect(obj, SIGNAL(destroyed()), &tracker, SLOT(onDestructor()));
    delete obj;

    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

它打印这个:

MyObject constructor
MyObject destructor
About to be destroyed!
Run Code Online (Sandbox Code Playgroud)

这种行为与Qt文档相矛盾:"此信号在对象obj被销毁之前立即发出,并且无法阻止." 为什么会这样?

Mic*_*urr 24

如果你考虑信号将如何发射,它是由基础QObject完成的 - 这就是QObject知道它被破坏的方式.

因此,当派生类被销毁时,最派生的析构函数首先运行(按照标准C++ dtor处理),并"MyObject destructor"显示消息.当dtor完成时,基本dtors运行,在这种情况下,它是QObject dtor,然后发出信号并"About to be destroyed!"显示消息.

您提到的文档中的措辞可能有点不精确.它的措辞可能更好,例如"当对象obj被破坏时发出此信号"或"在对象obj完全被破坏之前立即发出此信号".