Удаляет ли QPointer::clear() свой ссылочный указатель или "очищает этот объект QPointer". что-то еще значит?

QPointer есть метод, clear(),

Очищает этот объект QPointer.

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

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

или же

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

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

2 ответа

Решение

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

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

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());
}
Другие вопросы по тегам