如何跟踪计划稍后删除的对象?

sig*_*gil 5 c++ qt

在 Qt 中经常建议使用它deleteLater()来代替普通的delete。然而,它会导致悬空对象的问题:它们被标记为删除,但仍然出现在 Qt API 返回的子列表中。(由于这种行为严重违反直觉,我快速发展的 Qt 怪癖让我验证了这一点。他们确实这样做了。) 那么,是否有一种惯用的方法来跟踪此类对象?当然,我可以使用临时解决方案,例如

class DeleteLaterable
{
public:
     void markForDeletion() { mMarked = true; }
     bool isMarked() const { return mMarked; }
private:
     bool mMarked = false;
};
Run Code Online (Sandbox Code Playgroud)

并公开继承它的所有内容,但它打开了一个完全不同的虚拟继承蠕虫罐头。还有更好的想法吗?

Ben*_*n T 3

从 Qt 5.8 开始,无法跟踪计划立即删除的对象。

调用deleteLater()只是将事件 ( QDeferredDeleteEvent) 发送到目标对象。由于无法获取待处理事件的列表,因此您无法知道哪个对象将接收 QDeferredDeleteEvent。

为了实现你想要的,有几种解决方案:

  1. 使用“DeleteLaterManager”具有“deleteObject(QObject *)”函数的类,该函数将调用deletelater()并跟踪对象直到删除。
  2. 重新实现 QAbstractEventDispatcher 并跟踪 类型的事件QEvent::DeferredDelete
  3. 使用 and 类型的自定义事件类,QEvent::DeferredDelete而不是调用deleteLater()call QCoreApplication::postEvent()

如果您只关心子列表中显示的此类对象,则可以在调用 deleteLater() 时简单地删除其父对象。

顺便说一句,为什么“这种行为严重违反直觉”?文档deleteLater()只是说明该对象将被安排删除,为什么父/子关系会受到影响?