QPointer
есть метод, clear()
.
Очищает этот объект QPointer.
Я не уверен, что именно означает «ясно». На мой взгляд, это может означать
или же
QPointer<T>
Объект больше не привязан ни к одному указателю.Может, это что-то еще значит? Не могли бы вы дать мне знать, что он на самом деле делает?
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());
}