QPointer::clear() 是删除其引用的指针,还是“清除此 QPointer 对象”是什么意思?

Does QPointer::clear() delete its referenced pointer, or does "Clears this QPointer object." mean something else?

提问人:Anon 提问时间:6/2/2018 最后编辑:trincotAnon 更新时间:8/27/2021 访问量:2420

问:

QPointer有一个方法,clear()。

清除此 QPointer 对象。

我不确定“清除”到底是什么意思。在我看来,这可能意味着

  1. 它将删除您引用的指针。

  1. 它会取消附加您引用的指针,将该指针保留在堆上,并且对象不再绑定到任何指针。QPointer<T>

也许这意味着别的什么?你能告诉我它到底是做什么的吗?

C++ Qt 指针 堆内存 qpointer

评论


答:

7赞 Kuba hasn't forgotten Monica 6/2/2018 #1

QPointer是一个跟踪指针。它跟踪对象的生存期。它不做任何拥有职责。它永远不会解除分配 拥有的任何存储。它可以释放底层实现细节 - 共享引用对象,但这不会影响用户真正关心的任何内容;只有当底层对象消失而最后一个对象被销毁时,这些对象才会被释放。QObjectQObjectQPointer

它将删除您引用的指针。

恕我直言,这是一种相当令人困惑的语言。指针是值。引用指针具有公认的含义:

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。仅仅因为我可能理解你的意思并不意味着任何人都应该这样说话:)

A 跟踪 -instance(对象)的生存期。它是它跟踪的对象,而不是指针。因此,不跟踪它所跟踪的任何类型的对象。就这样。这就是在不让每个人都怀疑自己的理智的情况下怎么说的:)QPointer<T>Tclear()QPointerT

的确,使跟踪对象的方式是通过原始指针指向它。这就是你开始的方式,仅此而已。QPointerQPointer

与堆混淆是不正确的 - 下面的示例中没有涉及堆,至少没有显式涉及堆。该实例是一个自动变量。实现可以自由地将其放在某种动态存储中 - 甚至是字面堆,但这是C++解释器的典型特征,而不是我们通常习惯:)QPointerobj

#include <QtCore>
int main() {
  QPointer<QObject> p;
  Q_ASSERT(p.isNull());
  {
    QObject obj;
    p = &obj;
    Q_ASSERT(!p.isNull());
  }
  Q_ASSERT(p.isNull());
}