QPointer, QSharedPointer和QWeakPointer类之间的区别是什么?

What is the difference between QPointer, QSharedPointer and QWeakPointer classes in Qt?

本文关键字:区别 是什么 之间 QSharedPointer QWeakPointer QPointer      更新时间:2023-10-16

我已经阅读了关于QPointer, QSharedPointerQWeakPointer类的Qt文档。上面写着:

  1. QPointer是一个模板类,提供了Qt对象的保护指针,行为像一个普通的c++指针,除了它被自动设置为0时,引用的对象被销毁,没有"悬空指针"产生。

  2. QSharedPointer类保存了一个对共享指针的强引用。
  3. QWeakPointer类保存了一个对共享指针的弱引用。

我的问题是"这些类之间有什么区别?"也就是说,指向对象的指针和指向指针的引用之间有什么区别?它们是否都指向具有不同机制和行为的对象?

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被破坏时为空。