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