Qt智能指针使用指南 帮助篇

Qt智能指针使用指南 帮助篇

http://mobile.51cto.com/symbian-272817.htm

Qt智能指针使用指南 帮助篇,为友们分享,字啊本文中,我们一起来了关于指针的知识。先来卡本文。

作者:佚名来源:互联网|2011-07-01 14:28

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


本篇文章介绍的是Qt智能指针使用指南 帮助篇,Qt提供了很多智能指针的类,比较常见的有QPointer, QSharedDataPointer ,QSharedPointer,QWeakPointer和QScopedPointer等等,它们被引入的Qt版本即描述如下:

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的示例:

  1. int main(int argc, char *argv[])     
  2. {     
  3.     QCoreApplication a(argc, argv);     
  4.     //raw pointer     
  5.     QString *p = new QString("hello");     
  6.     //Implements non-reference-counted strong pointer     
  7.     QScopedPointer<QString> pScopedPointer(new QString("Scoped"));     
  8.     // Build error, can NOT be shared and reference-counted     
  9.     //QScopedPointer<QStringpScopedPointerpScopedPointer2 = pScopedPointer;     
  10.     //Implements reference-counted strong sharing of pointers     
  11.     QSharedPointer<QString> pSmart(new QString("Smart"));     
  12.     QSharedPointer<QString> pSmart2;     
  13.     pSmart2 = QSharedPointer<QString>(new QString("smart 2"));     
  14.     QSharedPointer<QString> pSharedPoninter;     
  15.     // can be shared safely and reference-counted     
  16.     pSharedPoninter = pSmart;     
  17.     qDebug() << *(pSmart.data());     
  18.     qDebug() << *(pSmart2.data());     
  19.     qDebug() << *(pSharedPoninter.data());     
  20.     QTimer *timer = new QTimer();     
  21.     QWeakPointer<QTimerpWeakPointer = timer;     
  22.     //Weak pointer's resources can be deleted from outside world     
  23.     delete timer;     
  24.     if (pWeakPointer.isNull())     
  25.     {     
  26.         qDebug() << "contained QObject has been deleted";     
  27.     }     
  28. }   
#include <QCoreApplication>
#include <QSharedPointer>
#include <QDebug>
#include <QTimer>

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
    {
        QString* pStr=new QString("Smart");
        QSharedPointer<QString> pSmart(pStr);
        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());
        delete pStr;
        qDebug()<<"after delete pStr...";
        qDebug() << *(pSmart.data());
        qDebug() << *(pSharedPoninter.data());
        qDebug()<<(pSmart.isNull()?"pSmart.isNull":"pSmart.is not Null");
        qDebug()<<(pSharedPoninter.isNull()?"pSharedPoninter.isNull":"pSharedPoninter.is not Null");
/*
"Smart"
"smart 2"
"Smart"
after delete pStr...
""
""
pSmart.is not Null
pSharedPoninter.is not Null
*/
    }
    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";
    }
    return a.exec();
}
/*
"Smart"
"smart 2"
"Smart"
contained QObject has been deleted
*/

 

小结:关于Qt智能指针使用指南 帮助篇的内容介绍完了,希望本文对你有所帮助!

【编辑推荐】

【责任编辑:李程站 TEL:(010)68476606】
 
posted @ 2018-04-24 23:35  sky20080101  阅读(239)  评论(0)    收藏  举报