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

时间:2014-03-10 15:18:34

标签: c++ qt pointers qsharedpointer qpointer

我已阅读有关QPointerQSharedPointerQWeakPointer类的Qt文档。它说:

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

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

  3. QWeakPointer类包含对共享指针的弱引用。

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

2 个答案:

答案 0 :(得分:57)

<强> 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()来确定指针为空。

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

答案 1 :(得分:3)

  • QSharedPointerstd::shared_ptr
  • QWeakPointerstd::weak_ptr
  • QScopedPointerstd::unique_ptr
  • QPointer:没有等效的STL。当QObject销毁时为空。