我已经阅读了关于QPointer
, QSharedPointer
和QWeakPointer
类的Qt文档。上面写着:
-
QPointer
是一个模板类,提供了Qt对象的保护指针,行为像一个普通的c++指针,除了它被自动设置为0时,引用的对象被销毁,没有"悬空指针"产生。 QWeakPointer
类保存了一个对共享指针的弱引用。
QSharedPointer
类保存了一个对共享指针的强引用。我的问题是"这些类之间有什么区别?"也就是说,指向对象的指针和指向指针的引用之间有什么区别?它们是否都指向具有不同机制和行为的对象?
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()
或isNull()
判断指针为空。
一般来说,要使用弱指针,必须将其转换为共享指针,因为这样的操作可以确保该对象在使用期间一直存在。这相当于为访问"锁定"对象,并且是使用弱指针所指向的对象的唯一正确方法。
QScopedPointer:
这只是一个helper类,当指针超出作用域时,它将删除被引用的对象。因此,将动态分配的对象绑定到变量作用域。
您可以将此用于本地的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
}
-
QSharedPointer
:std::shared_ptr
-
QWeakPointer
:std::weak_ptr
-
QScopedPointer
:std::unique_ptr
-
QPointer
:没有STL等效。当QObject被破坏时为空。