【问题标题】:How deleteLater() actually works in qt?deleteLater() 如何在 qt 中实际工作?
【发布时间】:2019-09-26 20:58:23
【问题描述】:

准系统示例:

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

【问题讨论】:

  • 这很容易测试...从Object的析构函数中打印一条带有对象地址的消息,并在构造时将其与AB的地址进行比较(或向对象添加标识符并打印,等等...)
  • 好的,我试过了,显然原来的被删除了。所以我猜它是一个指向对象的临时指针?
  • 是的 - 它存储要删除的对象的地址。 Qt 不在乎 给它起什么名字(即你在调用 deleteLater 之后用你的指针做什么)。

标签: c++ qt


【解决方案1】:

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

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

在 QObject::deleteLater() 中,该方法通过 this 指针引用它所调用的对象,独立于引用同一对象的任何其他变量(例如 o)。

【讨论】:

    【解决方案2】:

    基本上它只是用deferredDelete 类型的事件和你的QObject 作为接收器执行QCoreApplication::postEvent,当这个事件最终被分派到上述QObject 时,只有一个基本上在执行delete this 的函数。

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

    【讨论】:

      【解决方案3】:

      除了Predelnik的回答:

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

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

      干杯

      【讨论】:

        猜你喜欢
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 2014-02-21
        • 1970-01-01
        • 2015-04-24
        • 2021-11-15
        相关资源
        最近更新 更多