Qt智能指針QPointer, QSharedDataPointer ,QSharedPointer,QWeakPointer和QScopedPointer


QPointer (4.0) 已經過時,可以被QWeakPointer所替代,它不是線程安全的。

QSharedDataPointer (4.0) -- 提供對數據的COPY-ON-WRITE以及淺拷貝,提供對數據(而不是指向數據的指針)的線程安全的保護。(注:提供對數據的線程安全保護要結合QsharedData來完成),它是線程安全的。

QSharedPointer (4.5)-- 實現了引用計數的可共享資源的強類型指針,它是線程安全的。

QWeakPointer (4.5)-- 實現了引用計數的可共享資源的弱類型指針,它是線程安全的。

QScopedPointer (4.6)-- 實現了非引用計數獨享資源的強類型指針,它是線程安全的。

strong pointer :在有它所指向的資源的所有權期間,永遠不會放棄這個所有權。

weak pointer:在有它所指向的資源的所有權期間,允許外界釋放其資源從而使其放棄這個所有權。

QSharedPointer有着與std::auto_ptr類似的特性,而最大的區別在於它不能轉讓所有權而auto_ptr可以。事實上,scoped_ptr永遠不能被復制或被賦值

下面代碼使用QSharedPointer,QWeakPointer和QScopedPointer的示例:

int main(int argc, char *argv[])     
{     
    QCoreApplication a(argc, argv);     
    //raw pointer     
    QString *p = new QString("hello");     
    //Implements non-reference-counted strong pointer     
    QScopedPointer<QString> pScopedPointer(new QString("Scoped"));     
    // Build error, can NOT be shared and reference-counted     
    //QScopedPointer<QString> pScopedPointerpScopedPointer2 = pScopedPointer;     
    //Implements reference-counted strong sharing of pointers     
    QSharedPointer<QString> pSmart(new QString("Smart"));     
    QSharedPointer<QString> pSmart2;     
    pSmart2 = QSharedPointer<QString>(new QString("smart 2"));     
    QSharedPointer<QString> pSharedPoninter;     
    // can be shared safely and reference-counted     
    pSharedPoninter = pSmart;     
    qDebug() << *(pSmart.data());     
    qDebug() << *(pSmart2.data());     
    qDebug() << *(pSharedPoninter.data());     
    QTimer *timer = new QTimer();     
    QWeakPointer<QTimer> pWeakPointer = timer;     
    //Weak pointer's resources can be deleted from outside world     
    delete timer;     
    if (pWeakPointer.isNull())     
    {     
        qDebug() << "contained QObject has been deleted";     
    }     
}   

 

 

原文地址:http://mobile.51cto.com/symbian-272817.htm

https://www.xuebuyuan.com/727528.html

https://blog.csdn.net/yao5hed/article/details/81092152

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM