C++ deleteLater()在qt中实际如何工作?

C++ deleteLater()在qt中实际如何工作?,c++,qt,C++,Qt,赤裸裸的例子: 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()是在调用时复制指针,还是在进入事件循环时删除任何指针 如果后者为真,我们如何删除

赤裸裸的例子:

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()是在调用时复制指针,还是在进入事件循环时删除任何指针

如果后者为真,我们如何删除需要重新初始化的指针呢?

QObject::deleteLater()
只是QObject的一个简单方法。不能对指针调用方法,只能对指针指向的对象调用方法。因此,deleteLater()在调用deleteLater()时对指针变量
o
指向的对象(
*o
)进行操作。它无法知道您正在使用的本地指针变量(
o
),这是您的私人业务

要共享实际指针变量,需要通过QObject**(指向QObject指针的指针;
&o
)将其传递到某个地方,而您不需要这样做


在QObject::deleteLater()中,方法引用通过
this
指针调用的对象,与引用同一对象的任何其他变量无关(例如
o
).

基本上它只是做
QCoreApplication::postEvent
,类型为
deferredDelete
的事件,你的
QObject
作为接收者,当这个事件最终被分派到前面提到的
QObject
时,只有一个函数基本上在做
删除这个


因此,指向您的对象的指针作为它的接收者愉快地生活在事件中。

除了Predelnik的答案之外:

基本上,
deleteLater()
垃圾收集的方式相同。当删除发生时还不是100%清楚,但它表示将在
事件循环中以低优先级删除它

所以它会做其他的事情,当有时间的时候,它会删除你的对象,并确保每个信号/插槽的东西都被制作出来,并且对象被保存以删除。 这是删除
QObject
的首选方法,因为回调不会出现问题


干杯

这很容易测试。。。用对象的地址打印一条来自
对象的析构函数的消息,并在构造时将其与
a
B
的地址进行比较(或向对象添加一个标识符并打印该标识符,等等)。好的,我尝试了这个方法,显然原始地址被删除了。所以我猜它是一个指向对象的临时指针?是的-它存储了要删除的对象的地址。Qt不在乎您将其命名为什么(即,在调用deleteLater后如何处理指针)。