首页 > 其他分享 >QPointer、QScopedPointer、QSharedPointer、QWeakPointer

QPointer、QScopedPointer、QSharedPointer、QWeakPointer

时间:2024-08-23 16:18:07浏览次数:8  
标签:QPointer std QSharedPointer QScopedPointer QWeakPointer ptr

QPointer、QScopedPointer、QSharedPointer、QWeakPointer

  • QSharedPointerstd::shared_ptr
  • QWeakPointerstd::weak_ptr
  • QScopedPointerstd::unique_ptr
  • QPointer:无 STL 等效项。QObject 析构时为空。

QPointer

功能:一个“半自动”的指针包装器。通常情况下,我们在手动 delete 一个指针的时候,需要再将其置空来防止其变成一个悬挂指针,那么QPointer 就是帮忙干这事的,会在对象被销毁时,自动将底层指针设置为 NULL

注意:

  • QPointer所指向的对象必须是QObject或其派生类对象。 因为其对象析构时会执行QObject的析构函数,进而执行QObjectPrivate::clearGuards(this);
  • 底层实现是 QWeakPointer ,因此不会影响引用计数。
  • 调用其 clear() 成员函数会置空其内部 QWeakPointer (注意不会析构所指对象),此时 isNull() 成员函数返回 true
QObject *obj = new QObject();
QPointer<QObject> pObj(obj);
Q_ASSERT(!pObj.isNull()); // pObj 非空
delete obj;
Q_ASSERT(pObj.isNull()); // pObj 现在是 nullptr

细节

QPointer<QLabel> pLabel = new QLabel() ;

pLabel是我们申请出来的QLabel对象,如果想要使用QLabel的成员函数怎么调用呢?

注意:对于QPointer的对象,写“.”和“->”所调用的成员变量是不同的,一个是QPointer对象本身,一个是QPointer指向的指针对象。

调用QPointer的成员 调用QLabel的成员
img img

QScopedPointer

一个独占指针。当其离开作用域时自动析构所指对象。相当于 std::unique_ptr

对应的还有一个指针 QScopedArrayPointer ,专门用于处理数组,其用法和 QScopedPointer 是一样的。

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

int *pI = new int();
QSharedPointer<int> pI1(pI);
QSharedPointer<int> pI2 = pI1;
pI1.clear(); // 引用计数现在-1,2 -> 1
pI2.clear(); // 引用计数现在-1,1 -> 0,pI 被释放

QWeakPointer

可以保存对共享指针的弱引用。它不会阻止对象被销毁,而只是重置。相当于 std::weak_ptr,其中 QSharedPointer<T> QWeakPointer::toStrongRef() 相当于 std::shared_ptr<T> std::weak_ptr::lock()

int *pI = new int();
QSharedPointer<int> pI1(pI);
QWeakPointer<int> pI2 = pI1;
pI1.clear(); // // 引用计数现在-1,1 -> 0,pI 被释放
// 使用toStrongRef来得到对应的QSharedPointer,同时引用计数+1
QSharedPointer<int> pI2_locked = pI2.toStrongRef();
Q_ASSERT(pI2_locked.isNull());

标签:QPointer,std,QSharedPointer,QScopedPointer,QWeakPointer,ptr
From: https://www.cnblogs.com/3to4/p/18376288

相关文章

  • QT 智能指针 QPointer QScopedPointer QSharedPointer QWeakPointer QSharedDataPoint
    QPointerQPointer是一种受保护的指针,当其引用的对象被销毁时,它会被自动清除(但是,销毁引用对象还是必须手动delete)。QPointer所指向的对象必须是QObject或其派生类对象。当多个指针指向同一个Object对象时,引用的对象可能被释放掉,这时使用QPointer就可以安全的测试引用对象是......
  • QPointer的使用以及场景
    QPointer的使用以及场景在我们项目开发中,经常会遇到这种情况,在A中引用了B的对象,但是你却不知道B什么时候会析构,所以使用它会出现异常;所以今天的主角要登场了QPointer可以完美的解决这样的问题。先来看一下介绍 TheQPointerclassisatemplateclassthatprovidesguardedpoin......