deleteLater() 在 qt 中是如何工作的
How deleteLater() actually works in 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() 是在调用时复制指针,还是删除进入事件循环时持有的任何指针?
如果后者为真,我们如何删除需要重新初始化的指针?
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
的首选方法,因为回调不会有问题。
干杯
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?