QPointer:
QPointer
只能指向QObject
实例。nullptr
如果指向的对象被销毁,它将自动设置为。它是一个专门用于 的弱指针QObject
。
考虑这个片段:
QObject *obj = new QObject;
QPointer<QObject> pObj(obj);
delete obj;
Q_ASSERT(pObj.isNull()); // pObj will be nullptr now
QSharedPointer
引用计数指针。只有当所有共享指针都被销毁时,实际对象才会被删除。相当于std::shared_ptr
。
int *pI = new int;
QSharedPointer<int> pI1(pI);
QSharedPointer<int> pI2 = pI1;
pI1.clear();
// pI2 is still pointing to pI, so it is not deleted
pI2.clear();
// No shared pointers anymore, pI is deleted
注意只要有共享指针,对象就不会被删除!
QWeakPointer:
可以持有对共享指针的弱引用。它不会阻止对象被破坏,只是简单地重置。等价于std::weak_ptr
,其中lock
等价于toStrongRef
。
int *pI = new int;
QSharedPointer<int> pI1(pI);
QWeakPointer<int> pI2 = pI1;
pI1.clear();
// No shared pointers anymore, pI is deleted
//
// To use the shared pointer, we must "lock" it for use:
QSharedPointer<int> pI2_locked = pI2.toStrongRef();
Q_ASSERT(pI2_locked.isNull());
如果您需要访问由另一个模块控制的对象,则可以使用它。
要使用弱指针,您必须将其转换为QSharedPointer
. 你永远不应该基于弱指针是有效的决定。您只能使用data()
orisNull()
来确定指针是否为空。
通常,要使用弱指针,您必须将其转换为共享指针,因为这样的操作可确保对象在您使用它时一直存在。这相当于“锁定”对象以进行访问,并且是使用弱指针指向的对象的唯一正确方法。
QScopedPointer:
这只是一个帮助类,当指针超出范围时将删除引用的对象。因此,将动态分配的对象绑定到变量范围。
您可以将其用于本地人的 RAII 语义,例如:
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
}