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的示例:
- 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";
- }
- }
#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智能指针使用指南 帮助篇的内容介绍完了,希望本文对你有所帮助!
【编辑推荐】

浙公网安备 33010602011771号