deleteLater() 在 qt 中是如何工作的

How deleteLater() actually works in qt?

本文关键字:何工作 工作 qt deleteLater      更新时间:2023-10-16

准系统示例:

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::d eleteLater() 中,该方法通过 this 指针引用它的对象,独立于引用同一对象的任何其他变量(例如 o )。

基本上它只是对类型deferredDelete的事件和您作为接收器的QObject执行QCoreApplication::postEvent,当该事件最终被调度到上述QObject时,只有功能基本上是delete this

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

除了Predelnik的答案:

基本上,deleteLater()的做法与garbage collection相同。删除何时发生并不是 100% 清楚,但它说它将在低优先级的event loop中删除。

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

干杯