deleteLater()实际上如何在qt中运行?

时间:2014-02-08 16:29:14

标签: c++ qt

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()一个我们需要重新初始化的指针?

3 个答案:

答案 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的首选方法,因为您无法回调问题。

欢呼声