在 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)
并公开继承它的所有内容,但它打开了一个完全不同的虚拟继承蠕虫罐头。还有更好的想法吗?
从 Qt 5.8 开始,无法跟踪计划立即删除的对象。
调用deleteLater()只是将事件 ( QDeferredDeleteEvent) 发送到目标对象。由于无法获取待处理事件的列表,因此您无法知道哪个对象将接收 QDeferredDeleteEvent。
为了实现你想要的,有几种解决方案:
QEvent::DeferredDelete。QEvent::DeferredDelete而不是调用deleteLater()call QCoreApplication::postEvent()。如果您只关心子列表中显示的此类对象,则可以在调用 deleteLater() 时简单地删除其父对象。
顺便说一句,为什么“这种行为严重违反直觉”?文档deleteLater()只是说明该对象将被安排删除,为什么父/子关系会受到影响?