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

Aki*_*iva 4 c++ qt pointers heap-memory qpointer

QPointer有一个方法,clear()

清除这个 QPointer 对象。

我不确定“清楚”究竟是什么意思。在我看来,这可能意味着

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

或者

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

或许还有别的意思?你能告诉我它实际上是做什么的吗?

Rei*_*ica 5

QPointer是一个跟踪指针。它跟踪对象的生命周期。它不执行任何拥有职责。它永远不会释放QObject. 它可以释放底层实现细节——共享引用对象,但这不会影响用户真正关心的任何东西;只有当底层QObject消失并且最后一个QPointer正在被破坏时,这些对象才会被释放。

它会删除您引用的指针。

恕我直言,这是一种相当令人困惑的语言。指针是值。要引用指针有一个完善的含义:

const int *q = ....; // a pointer
*q; // a pointer dereference (not used for anything)
Run Code Online (Sandbox Code Playgroud)

对我来说,“删除指针”是这样的:

// 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
Run Code Online (Sandbox Code Playgroud)

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

这是肯定的指针,但那是名副其实的goobledygook。仅仅因为我可能理解你的意思并不意味着任何人都应该那样说话:)

AQPointer<T>跟踪一个T-instance的生命周期,一个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());
}
Run Code Online (Sandbox Code Playgroud)