zoukankan      html  css  js  c++  java
  • QPointer,QSharedPointer,QWeakPointer的区别与使用例子(QSharedPointer类似Delphi里的引用计数,是强引用,而QWeakPointer是弱引用,不影响原始对象的引用计数,相当于是在暗中观察对象,但保持联系,需要的时候就会出现)

    QPointer is a template class that provides guarded pointers to Qt objects and behaves like a normal C++ pointer except that it is automatically set to 0 when the referenced object is destroyed and no "dangling pointers" are produced.
    QSharedPointer class holds a strong reference to a shared pointer.
    QWeakPointer class holds a weak reference to a shared pointer.

    46down voteaccepted:


    QPointer:
    QPointer can only point to QObject instances. It will be automatically set to nullptr if the pointed to object is destroyed. It is a weak pointer specialized for QObject.

    Consider this fragment:

    QObject *obj = new QObject;
    QPointer<QObject> pObj(obj);
    delete obj;
    Q_ASSERT(pObj.isNull()); // pObj will be nullptr now
    QSharedPointer
    A reference-counted pointer. The actual object will only be deleted, when all shared pointers are destroyed. Equivalent to 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
    Note that as long there is a shared pointer, the object is not deleted!

    QWeakPointer:
    Can hold a weak reference to a shared pointer. It will not prevent the object from being destroyed, and is simply reset. Equivalent to std::weak_ptr, where lock is equivalent to 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());
    This can be used if you need access to an object that is controlled by another module.

    当对象被另一个单元所控制的时候,就可以使用QWeakPointer。

    To use a weak pointer, you must convert it to a QSharedPointer. You should never base a decision on the weak pointer being valid. You can only use data() of isNull to determine that the pointer is null.

    当使用QWeakPointer的时候,必须把它先转成QSharedPointer,你永远无法直接决定QWeakPointer是否是有效的。你只能使用data()去判断这个指针是否为空。

    Generally, to use a weak pointer, you must convert it to a shared pointer since such an operation ensures that the object will survive for as long as you are using it. This is equivalent to "locking" the object for access and is the only correct way of using the object pointed to by a weak pointer.

    一般来说,必须先转换成强引用。而强引用相当于锁定了这个对象。


    https://stackoverflow.com/questions/22304118/what-is-the-difference-between-qpointer-qsharedpointer-and-qweakpointer-classes 

  • 相关阅读:
    Python 操作Excel之通过xlutils实现在保留原格式的情况下追加写入数据
    【转载】Python字符串操作之字符串分割与组合
    【转】Python判断字符串是否为字母或者数字
    Appium 在测试android混合应用时,关于webview页面切换的那些事儿
    使用pip install XX 命令时报错
    Appium笔记(二) 丶Appium的安装
    Android SDK的下载与安装
    KlayGE 4.4中渲染的改进(五):OpenGL 4.4和OpenGLES 3
    最先进的开源游戏引擎KlayGE 4.4发布
    KlayGE 4.4中渲染的改进(四):SSSSS
  • 原文地址:https://www.cnblogs.com/findumars/p/7517351.html
Copyright © 2011-2022 走看看