Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

QPointer has a method, clear().

Clears this QPointer object.

I am not sure what "clear" exactly means. In my mind, it could mean

  1. It deletes the pointer you referenced.

or

  1. It un-attaches the pointer you referenced, leaving that pointer on the heap, and the QPointer<T> object no longer tied to any pointer.

Maybe it means something else? Could you please let me know what it actually does?

like image 320
Anon Avatar asked Jun 01 '18 18:06

Anon


1 Answers

QPointer is a tracking pointer. It tracks the lifetime of an object. It doesn't do any owning duties. It never will deallocate any storage owned by QObject. It can deallocate the underlying implementation detail - the shared reference object, but that doesn't affect anything really that the user cares about; those objects are deallocated only when the underlying QObject is gone and the last QPointer is being destructed.

It deletes the pointer you referenced.

That's IMHO a rather confusing language. Pointers are values. To reference a pointer has a well established meaning:

const int *q = ....; // a pointer
*q; // a pointer dereference (not used for anything)

To me, "deleting a pointer" is this:

// 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

It un-attaches the pointer you referenced, leaving that pointer on the heap, and the QPointer<T> object no longer tied to any pointer.

It's pointers galore for sure, but that's veritable goobledygook. Just because I might understand what you mean doesn't imply that anyone should talk that way :)

A QPointer<T> tracks the lifetime of a T-instance, an object. It's objects it tracks, not pointers. So clear() makes the QPointer not track whatever object of type T it was tracking. That's all. And that's how to say it without making everyone doubt their sanity :)

It is true that the way you make a QPointer track an object is by pointing to it via a raw pointer. That's just how you get a QPointer going, that's all.

It is incorrect to conflate QPointer with heap - no heap is involved in the example below, at least not explicitly. The obj instance is an automatic variable. Implementations are free to put it on the dynamic store of some kind - even a literal heap, but that's typical of C++ interpreters and not what we're usually used to :)

#include <QtCore>
int main() {
  QPointer<QObject> p;
  Q_ASSERT(p.isNull());
  {
    QObject obj;
    p = &obj;
    Q_ASSERT(!p.isNull());
  }
  Q_ASSERT(p.isNull());
}
like image 146
Kuba hasn't forgotten Monica Avatar answered Nov 17 '22 05:11

Kuba hasn't forgotten Monica