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());
}