QPointer、QScopedPointer、QSharedPointer、QWeakPointer
QSharedPointer
:std::shared_ptr
QWeakPointer
:std::weak_ptr
QScopedPointer
:std::unique_ptr
QPointer
:无 STL 等效项。QObject 析构时为空。
QPointer
功能:一个“半自动”的指针包装器。通常情况下,我们在手动 delete
一个指针的时候,需要再将其置空来防止其变成一个悬挂指针,那么QPointer
就是帮忙干这事的,会在对象被销毁时,自动将底层指针设置为 NULL
。
注意:
- QPointer所指向的对象必须是QObject或其派生类对象。 因为其对象析构时会执行QObject的析构函数,进而执行QObjectPrivate::clearGuards(this);
- 底层实现是
QWeakPointer
,因此不会影响引用计数。 - 调用其
clear()
成员函数会置空其内部QWeakPointer
(注意不会析构所指对象),此时isNull()
成员函数返回true
QObject *obj = new QObject();
QPointer<QObject> pObj(obj);
Q_ASSERT(!pObj.isNull()); // pObj 非空
delete obj;
Q_ASSERT(pObj.isNull()); // pObj 现在是 nullptr
细节
QPointer<QLabel> pLabel = new QLabel() ;
pLabel是我们申请出来的QLabel对象,如果想要使用QLabel的成员函数怎么调用呢?
注意:对于QPointer的对象,写“.”和“->”所调用的成员变量是不同的,一个是QPointer对象本身,一个是QPointer指向的指针对象。
调用QPointer的成员 | 调用QLabel的成员 |
---|---|
QScopedPointer
一个独占指针。当其离开作用域时自动析构所指对象。相当于 std::unique_ptr
。
对应的还有一个指针 QScopedArrayPointer
,专门用于处理数组,其用法和 QScopedPointer
是一样的。
MyClass *foo() {
QScopedPointer<MyClass> myItem(new MyClass);
// Some logic
if (some condition) {
return nullptr; // myItem will be deleted here
}
return myItem.take(); // Release item from scoped pointer and return it
}
另一个用例是对象的成员变量。那么您不需要为这些变量编写析构函数:
class MyClass {
public:
MyClass() : myPtr(new int) {}
private:
QScopedPointer<int> myPtr; // Will be deleted automatically when containing object is deleted
}
QSharedPointer
一个引用计数指针。只有当所有共享指针都被销毁时,实际对象才会被删除。相当于 std::shared_ptr
。
int *pI = new int();
QSharedPointer<int> pI1(pI);
QSharedPointer<int> pI2 = pI1;
pI1.clear(); // 引用计数现在-1,2 -> 1
pI2.clear(); // 引用计数现在-1,1 -> 0,pI 被释放
QWeakPointer
可以保存对共享指针的弱引用。它不会阻止对象被销毁,而只是重置。相当于 std::weak_ptr
,其中 QSharedPointer<T> QWeakPointer::toStrongRef()
相当于 std::shared_ptr<T> std::weak_ptr::lock()
。
int *pI = new int();
QSharedPointer<int> pI1(pI);
QWeakPointer<int> pI2 = pI1;
pI1.clear(); // // 引用计数现在-1,1 -> 0,pI 被释放
// 使用toStrongRef来得到对应的QSharedPointer,同时引用计数+1
QSharedPointer<int> pI2_locked = pI2.toStrongRef();
Q_ASSERT(pI2_locked.isNull());
标签:QPointer,std,QSharedPointer,QScopedPointer,QWeakPointer,ptr
From: https://www.cnblogs.com/3to4/p/18376288