我已阅读有关QPointer
,QSharedPointer
和QWeakPointer
类的Qt文档。它说:
QPointer
是一个模板类,它提供了对Qt对象的保护指针,其行为类似于普通的C ++指针,除了当被引用的对象被销毁并且没有“悬空指针”时它自动设置为0产生
QSharedPointer
类拥有对共享指针的强引用。
QWeakPointer
类包含对共享指针的弱引用。
我的问题是“这些课程之间有什么区别?”。即指向对象的指针和指针的引用有什么区别?它们都是指向具有不同机制和行为的对象的指针吗?
答案 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)
QSharedPointer
:std::shared_ptr
QWeakPointer
:std::weak_ptr
QScopedPointer
:std::unique_ptr
QPointer
:没有等效的STL。当QObject销毁时为空。