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完全被破坏之前立即发出此信号".
| 归档时间: |
|
| 查看次数: |
8596 次 |
| 最近记录: |