Qt智能指針使用指南 幫助篇
本篇文章介紹的是Qt智能指針使用指南 幫助篇,Qt提供了很多智能指針的類,比較常見的有QPointer, QSharedDataPointer ,QSharedPointer,QWeakPointer和QScopedPointer等等,它們被引入的Qt版本即描述如下:
QPointer (4.0) 已經(jīng)過時(shí),可以被QWeakPointer所替代,它不是線程安全的。
QSharedDataPointer (4.0) -- 提供對(duì)數(shù)據(jù)的COPY-ON-WRITE以及淺拷貝,提供對(duì)數(shù)據(jù)(而不是指向數(shù)據(jù)的指針)的線程安全的保護(hù)。(注:提供對(duì)數(shù)據(jù)的線程安全保護(hù)要結(jié)合QsharedData來完成),它是線程安全的。
QSharedPointer (4.5)-- 實(shí)現(xiàn)了引用計(jì)數(shù)的可共享資源的強(qiáng)類型指針,它是線程安全的。
QWeakPointer (4.5)-- 實(shí)現(xiàn)了引用計(jì)數(shù)的可共享資源的弱類型指針,它是線程安全的。
QScopedPointer (4.6)-- 實(shí)現(xiàn)了非引用計(jì)數(shù)的獨(dú)享資源的強(qiáng)類型指針,它是線程安全的。
strong pointer :在有它所指向的資源的所有權(quán)期間,永遠(yuǎn)不會(huì)放棄這個(gè)所有權(quán)。
weak pointer:在有它所指向的資源的所有權(quán)期間,允許外界釋放其資源從而使其放棄這個(gè)所有權(quán)。
QSharedPointer有著與std::auto_ptr類似的特性,而最大的區(qū)別在于它不能轉(zhuǎn)讓所有權(quán)而auto_ptr可以。事實(shí)上,scoped_ptr永遠(yuǎn)不能被復(fù)制或被賦值!
下面代碼使用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";
- }
- }
小結(jié):關(guān)于Qt智能指針使用指南 幫助篇的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!