c++ - 为什么在销毁后调用 QObject 销毁信号?

标签 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();
}

它打印这个:

MyObject constructor
MyObject destructor
About to be destroyed!

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

最佳答案

如果您考虑信号是如何发出的,它是由基本 QObject 完成的——这就是 QObject 知道它正在被销毁的方式。

因此,当派生类被销毁时,最派生的析构函数首先运行(根据标准 C++ dtor 处理),并显示 “MyObject destructor” 消息。当该 dtor 完成时,基础 dtor 开始运行,在本例中为 QObject dtor,然后发出信号并显示 “即将被销毁!” 消息。

您提到的文档中的措辞可能有点不准确。可能用类似“此信号在对象 obj 被销毁时发出”或“此信号在对象 obj 被完全销毁之前立即发出”这样的措辞更好。

关于c++ - 为什么在销毁后调用 QObject 销毁信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8683403/

相关文章:

c++ - Qt - 关于如何在 UI 窗体之间实现导航的任何指南?

c# - 关于C#中Dispose()和析构函数的两个问题

c++ - 使用析构函数进行线程连接

c++ - 为 arm : c++: error: unrecognized command line option ‘-mthumb’ ; did you mean ‘-mtbm’ ? 交叉编译 opencv

c++ - 命名空间和 c++/c 混合 header

c++ - 我可以在 C++ 方法中返回 NULL 指针吗?

c++ - 如何使用QTcpSocket(Qt4.7)读取完整数据

c++ - 调用 exit() 时会运行析构函数吗?

c++ - 如何在 Qt 中编写自定义弹出窗口?

带有 QList 的 C++ 多客户端 TCP 服务器