C++ QT智能指針的使用詳解
C++標(biāo)準(zhǔn)庫中的三種智能指針
std::shared_ptr:使用引用計(jì)數(shù),每一個(gè)shared_ptr的拷貝都指向相同的內(nèi)存,每次拷貝都會(huì)觸發(fā)引用計(jì)數(shù)+1,每次生命周期結(jié)束析構(gòu)的時(shí)候引用計(jì)數(shù)-1,在最后一個(gè)shared_ptr析構(gòu)的時(shí)候,內(nèi)存才會(huì)釋放。
std::weak_ptr:用來監(jiān)視shared_ptr的生命周期,它不管理shared_ptr內(nèi)部的指針,它的拷貝析構(gòu)都不會(huì)影響引用計(jì)數(shù),純粹是作為一個(gè)旁觀者監(jiān)視shared_ptr中管理的資源是否存在,可以用來返回this指針和解決循環(huán)引用問題。
std::unique_ptr:獨(dú)占型的智能指針,它不允許其它智能指針共享其內(nèi)部指針,也不允許unique_ptr的拷貝和賦值。
Qt中的智能指針
QPointer,提供了指向QObject的保護(hù)指針
QPointer只能用于指向QObject及派生類的對象。當(dāng)一個(gè)QObject或派生類對象被刪除后,QPointer能自動(dòng) 將其內(nèi)部的指針設(shè)置為0,這樣在使用QPointer之前就可以判斷一下是否有效。QPointer對象超出作用域時(shí),并不會(huì)刪除它指向的內(nèi)存對象。
- QScopedPointer,和std::unique_ptr其概念是一樣的
- QSharedPointer,和std::shared_ptr其作用是一樣的
- QWeakPointer,和std::weak_ptr功能是一樣的
一些名詞:空指針,野指針,垂懸指針,無效指針
- 空指針:指針值為NULL nullptr 0
- 野指針:指針未初始化地址
- 垂懸指針:指向已刪除(或釋放)的內(nèi)存位置的指針稱為懸空指針
- 無效指針:指針指向內(nèi)存的類型為void*,是一種特殊類型指針
使用Qt智能指針的設(shè)計(jì)需求通常涉及到以下幾個(gè)方面:
- 自動(dòng)內(nèi)存管理: 你希望確保在對象不再需要時(shí)能夠自動(dòng)釋放其內(nèi)存,避免內(nèi)存泄漏。
- 對象所有權(quán)的傳遞: 你希望在對象的所有權(quán)傳遞給其他部分時(shí),能夠方便地管理對象的生命周期。
- 對象的共享所有權(quán): 你希望多個(gè)部分能夠共享同一個(gè)對象,而不需要手動(dòng)跟蹤引用計(jì)數(shù)或手動(dòng)釋放內(nèi)存。
- 異常安全: 你希望在發(fā)生異常時(shí)能夠安全地釋放資源,而不會(huì)導(dǎo)致資源泄漏。
示例:圖形界面應(yīng)用中的資源管理
一個(gè)圖形界面應(yīng)用,其中有一個(gè)文檔對象,而文檔對象中包含多個(gè)圖形對象。每個(gè)圖形對象可能有自己的資源,例如圖像數(shù)據(jù)。你希望確保在文檔對象或圖形對象不再需要時(shí),相關(guān)的資源能夠被正確釋放。
#include <QSharedPointer> #include <QScopedPointer> #include <QDebug> // 假設(shè)的圖形對象類 class GraphicObject { public: GraphicObject() { qDebug() << "GraphicObject created"; } ~GraphicObject() { qDebug() << "GraphicObject destroyed"; } // 具體的圖形對象操作 }; // 文檔對象類 class Document { public: Document() { qDebug() << "Document created"; } ~Document() { qDebug() << "Document destroyed"; } // 添加圖形對象到文檔 void addGraphicObject(QSharedPointer<GraphicObject> graphicObject) { graphicObjects.append(graphicObject); } // 具體的文檔操作 private: QList<QSharedPointer<GraphicObject>> graphicObjects; }; int main() { // 使用 QSharedPointer 確保圖形對象的自動(dòng)釋放 QSharedPointer<GraphicObject> graphicObject(new GraphicObject); // 使用 QScopedPointer 確保文檔對象的自動(dòng)釋放 QScopedPointer<Document> document(new Document); // 將圖形對象添加到文檔 document->addGraphicObject(graphicObject); // 注意:在這里,graphicObject 和 document 會(huì)在適當(dāng)?shù)臅r(shí)候自動(dòng)釋放 return 0; }
Document 類包含一個(gè) QList,用于存儲(chǔ) QSharedPointer< GraphicObject >。這確保了在文檔對象析構(gòu)時(shí),與其關(guān)聯(lián)的所有圖形對象也會(huì)被正確釋放。同時(shí),QScopedPointer 確保了 Document 對象本身在不再需要時(shí)能夠被正確釋放。
智能指針管理內(nèi)存的一個(gè)關(guān)鍵特性:對象的生命周期與智能指針的生命周期綁定在一起
以上就是C++ QT智能指針的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于C++ QT智能指針的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
深入剖析C語言中qsort函數(shù)的實(shí)現(xiàn)原理
這篇文章主要介紹了C語言中qsort函數(shù)的實(shí)現(xiàn)原理,本文將從回調(diào)函數(shù),qsort函數(shù)的應(yīng)用,qsort函數(shù)的實(shí)現(xiàn)原理三個(gè)方面進(jìn)行講解,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-03-03VC6實(shí)現(xiàn)激活后臺(tái)窗口最佳方法
這篇文章主要介紹了VC6實(shí)現(xiàn)激活后臺(tái)窗口最佳方法,實(shí)例分析了VC操作后臺(tái)窗口的技巧,需要的朋友可以參考下2015-06-06淺析C++中memset,memcpy,strcpy的區(qū)別
本篇文章是對C++中memset,memcpy,strcpy的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07OpenCV實(shí)現(xiàn)輪廓的發(fā)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了OpenCV如何實(shí)現(xiàn)輪廓的發(fā)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05C++實(shí)現(xiàn)教職工信息管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)教職工信息管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03