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