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

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

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

并公开继承它的一切,但它打开了一整套不同的虚拟继承蠕虫.有更好的想法吗?

最佳答案 从Qt 5.8开始,无法开箱即可跟踪计划删除的对象.

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

要实现您的目标,有几种解决方案:

>使用“DeleteLaterManager”
一个带有“deleteObject(QObject *)”函数的类,它将调用deletelater()并跟踪对象,直到删除为止.
>重新实现QAbstractEventDispatcher并跟踪QEvent :: DeferredDelete类型的事件.
>使用QEvent :: DeferredDelete类型的自定义事件类,而不是调用deleteLater()调用QCoreApplication :: postEvent().

如果您只关心在子列表中显示的此类对象,则可以在调用deleteLater()时删除它们的父对象.

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

点赞