Удаляет ли QPointer :: clear () свой ссылочный указатель или «очищает этот объект QPointer».что-то еще значит? - PullRequest
0 голосов
/ 01 июня 2018

QPointer имеет метод, clear().

Удаляет этот объект QPointer.

Я не уверен, что "очиститьточно означает.На мой взгляд, это может означать

  1. . Он удаляет указатель, на который вы ссылались.

или

Он отменяет присоединение указателя, на который вы ссылались, оставляя этот указатель в куче, и объект QPointer<T> больше не привязывается к какому-либо указателю.

Может быть, это означает что-то еще?Не могли бы вы дать мне знать, что он на самом деле делает?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

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.Просто потому, что я могу понять, что вы имеете в виду, не означает, что кто-то должен так говорить:)

A QPointer<T> отслеживает время жизни T экземпляра, объекта .Это объекты это треки, а не указатели.Таким образом, 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());
}
0 голосов
/ 01 июня 2018

clear удаляет управляемый указатель.Если мы посмотрим на исходный код , то получим

inline void clear()
{ wp.clear(); }

, где wp - это QWeakPointer.Глядя на исходный код QWeakPointer clear определяется как

inline void clear() { *this = QWeakPointer(); }

, а QWeakPointer 's operator = 1 использует копирование и обмен

QWeakPointer &operator=(const QWeakPointer &other) Q_DECL_NOTHROW
{
    QWeakPointer copy(other);
    swap(copy);
    return *this;
}

Это означает, что у вас есть указатель, установленный в состояние по умолчанию, и указатель, который у вас был, выпадает из области видимости, деструктор запускается и возвращается память.

1: если семантика перемещения включена, процесс немного отличается, но результат тот же.

...