c++ - QPointer::clear() 是否删除其引用的指针,或者是否“清除此 QPointer 对象”。还有别的意思吗?
问题描述
QPointer
有方法,clear()
.
清除此 QPointer 对象。
我不确定“清晰”到底是什么意思。在我看来,这可能意味着
- 它会删除您引用的指针。
或者
- 它取消附加您引用的指针,将该指针留在堆上,并且
QPointer<T>
对象不再绑定到任何指针。
或许还有别的意思?你能告诉我它实际上是做什么的吗?
解决方案
QPointer
是一个跟踪指针。它跟踪对象的生命周期。它不做任何拥有的职责。它永远不会释放QObject
. 它可以取消分配底层实现细节——共享引用对象,但这不会影响用户真正关心的任何事情;只有当底层QObject
已经消失并且最后一个QPointer
被破坏时,这些对象才会被释放。
它会删除您引用的指针。
恕我直言,这是一种相当令人困惑的语言。指针是值。引用指针具有明确的含义:
const int *q = ....; // a pointer
*q; // a pointer dereference (not used for anything)
对我来说,“删除指针”是这样的:
// dynamically allocate a pointer
int **p = new int*();
// make it point somewhere
int i = {};
assert(0 == i);
*p = &i;
// use it
**p = 44;
assert(44 == i);
// delete it
delete p; // a pointer-to-integer got deleted
它取消附加您引用的指针,将该指针留在堆上,并且
QPointer<T>
对象不再绑定到任何指针。
肯定有大量的指针,但那是名副其实的 goobledygook。仅仅因为我可能理解你的意思并不意味着任何人都应该那样说话:)
AQPointer<T>
跟踪一个T
-instance, an object的生命周期。它跟踪的是对象,而不是指针。因此clear()
,QPointer
不跟踪T
它正在跟踪的任何类型的对象。就这样。这就是如何在不让每个人怀疑他们的理智的情况下说出来的:)
确实,您制作QPointer
跟踪对象的方式是通过原始指针指向它。这就是你QPointer
前进的方式,仅此而已。
将堆与堆混为一谈是不正确的QPointer
——下面的示例中不涉及堆,至少没有明确地涉及。该obj
实例是一个自动变量。实现可以自由地将它放在某种动态存储上——甚至是字面堆,但这是 C++ 解释器的典型特征,而不是我们通常习惯的 :)
#include <QtCore>
int main() {
QPointer<QObject> p;
Q_ASSERT(p.isNull());
{
QObject obj;
p = &obj;
Q_ASSERT(!p.isNull());
}
Q_ASSERT(p.isNull());
}
推荐阅读
- html - 网格 - 宽度列 - Css
- android - 如何在反应原生应用程序中以编程方式触发视频完整 [android 和 IOS]
- typescript - 为已发布的 NPM 包中的第三方库导出自定义类型
- python - 可以在 Google Colab 上导入 keras-bert 吗?
- c++ - 如何在 C++ 中安全正确地使用线程?
- reactjs - 当我的反应应用程序单击列表项时,如何让我的反应应用程序在我的引导模式中显示对象信息?
- flutter - 我可以在颤振应用程序中使用 appium 来访问另一个应用程序吗
- javascript - 为什么在我的网站上重定向只能使用一次?
- reactjs - 如何使用数组映射内部的变量来控制 Material UI 上的样式?
- windows - Qt 在 Windows 上静态构建 5.15.2 x86,构建错误