【发布时间】:2011-06-20 18:22:52
【问题描述】:
有一个类 QNetworkReply 的对象。有一个插槽(在其他对象中)连接到它的finished() 信号。信号是同步的(默认的)。只有一个线程。
有时我想摆脱这两个对象。没有更多的信号或来自他们的任何东西。我要他们走。 好吧,我想,我会用
delete obj1; delete obj2;
但我真的可以吗? ~QObject 的规格说:
在挂起的事件等待传递时删除 QObject 可能会导致崩溃。
什么是“待定事件”?
这是否意味着当我打电话给我的delete 时,已经有一些“待处理的事件”要传递,它们可能会导致崩溃,而我无法真正检查是否有任何事件?
假设我打电话:
obj1->deleteLater(); obj2->deleteLater();
为了安全。
但是,我真的安全吗? deleteLater 添加了一个事件,当控制到达那里时,该事件将在主循环中处理。是否已经存在obj1 或obj2 的一些未决事件(信号),等待在主循环中处理 before deleteLater 将被处理?那将是非常不幸的。我不想编写代码检查“有点删除”状态并忽略所有插槽中的传入信号。
【问题讨论】:
-
看起来
obj->disconnect(); obj->deleteLater();是正确的选择: -
阅读 QObject 源代码后,
deleteLater()似乎只是将QDeferredDeleteEvent发布到调用deleteLater()的对象上。当 QObject 接收到该事件时,其事件处理程序最终将调用常规的delete,而后者又调用 QObject 的析构函数。信号断开直到析构函数结束才会发生,因此我猜 QObject 将运行由 DirectConnection 信号调用的槽,这些信号在调用deleteLater()之后但在事件循环返回之前发出。
标签: qt qt-signals slot