Qt中的QPointer,QSharedPointer和QWeakPointer类有什么区别?

Nej*_*jat 29 c++ qt pointers qpointer qsharedpointer

我已经约了Qt单证阅读QPointer,QSharedPointerQWeakPointer类.它说:

  1. QPointer 是一个模板类,它提供了对Qt对象的保护指针,其行为类似于普通的C++指针,只是当被引用的对象被销毁并且没有产生"悬空指针"时它会自动设置为0.

  2. QSharedPointer class拥有对共享指针的强引用.

  3. QWeakPointer class持有对共享指针的弱引用.

我的问题是"这些课程有什么区别?".即指向对象的指针和指针的引用之间的区别是什么?它们都是指向具有不同机制和行为的对象的指针吗?

kin*_*nak 61

QPointer:
QPointer只能指向QObject实例.nullptr如果指向的对象被销毁,它将自动设置为.它是专门用于的弱指针QObject.

考虑这个片段:

QObject *obj = new QObject;
QPointer<QObject> pObj(obj);
delete obj;
Q_ASSERT(pObj.isNull()); // pObj will be nullptr now
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

请注意,只要有共享指针,该对象就不会被删除!

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());
Run Code Online (Sandbox Code Playgroud)

如果您需要访问由另一个模块控制的对象,则可以使用此选项.

要使用弱指针,必须将其转换为QSharedPointer.你永远不应该根据弱指针的有效性作出决定.您只能使用data()isNull()确定指针为空.

通常,要使用弱指针,必须将其转换为共享指针,因为这样的操作可确保对象在您使用它时能够存活.这相当于"锁定"对象以进行访问,并且是使用弱指针指向的对象的唯一正确方法.


Kei*_*ell 6

  • QSharedPointer:std::shared_ptr
  • QWeakPointer:std::weak_ptr
  • QScopedPointer:std::unique_ptr
  • QPointer:没有 STL 等效项。当 QObject 销毁时为 Null。