Barebones示例:
Object * o = new Object(); //let's call this one object A on heap
o->deleteLater();
o = new Object(); //and let's call this one object B on heap
当我们进入事件循环时,deleteLater()会删除A还是B?我想我的问题是,deleteLater()是否在调用时制作指针的副本,或者在进入事件循环时是否删除指针所持有的指针?
如果后者是真的,我们如何deleteLater()一个我们需要重新初始化的指针?
答案 0 :(得分:4)
QObject::deleteLater()
只是QObject的一种简单方法。您不能仅在指针指向的对象上调用指针上的方法。因此deleteLater()在您调用deleteLater()时对指针变量o
指向的对象(*o
)进行操作。它无法知道您正在使用的本地指针变量(o
),这是您的私人业务。
要共享实际的指针变量,有必要通过QObject **(指向QObject指针的指针; &o
)将其传递到某处,而不是。
在QObject :: deleteLater()中,该方法通过this
指针引用它所调用的对象,与引用同一对象的任何其他变量无关(例如o
)。
答案 1 :(得分:2)
基本上它只是QCoreApplication::postEvent
使用类型为deferredDelete
的事件而你的QObject
作为接收者,当这个事件最终被调度到前面提到的QObject
时,只有函数基本上是delete this
。
所以指向你的对象的指针快乐地生活在事件中,因为它是接收者。
答案 2 :(得分:0)
除了Predelnik的回答:
基本上deleteLater()
与carbage collection
的方式相同。删除发生时并非100%清楚,但它表示将在event loop
中删除优先级较低的内容。
所以它会做其他所有事情,当有时间它将删除你的对象并确保每个信号/插槽的东西都被创建并且对象被保存为删除。
并且它是删除QObject
的首选方法,因为您无法回调问题。
欢呼声