欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ QT智能指針的使用詳解

 更新時(shí)間:2023年12月30日 10:36:55   作者:我不是程序猿兒  
這篇文章主要介紹了C++ QT智能指針的使用,Qt是一個(gè)跨平臺(tái)的C++框架,主要用來(lái)開(kāi)發(fā)圖形用戶(hù)界面程序,也可以開(kāi)發(fā)不帶界面的命令行程序,下面我們來(lái)了解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)原理

    這篇文章主要介紹了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-03
  • C++深入分析STL中map容器的使用

    C++深入分析STL中map容器的使用

    map在編程中是經(jīng)常使用的一個(gè)容器,本文來(lái)講解一下STL中的map,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • VC6實(shí)現(xiàn)激活后臺(tái)窗口最佳方法

    VC6實(shí)現(xiàn)激活后臺(tái)窗口最佳方法

    這篇文章主要介紹了VC6實(shí)現(xiàn)激活后臺(tái)窗口最佳方法,實(shí)例分析了VC操作后臺(tái)窗口的技巧,需要的朋友可以參考下
    2015-06-06
  • C++之IO類(lèi),文件輸入輸出,string流練習(xí)題

    C++之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ū)別

    淺析C++中memset,memcpy,strcpy的區(qū)別

    本篇文章是對(duì)C++中memset,memcpy,strcpy的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • OpenCV實(shí)現(xiàn)輪廓的發(fā)現(xiàn)

    OpenCV實(shí)現(xiàn)輪廓的發(fā)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了OpenCV如何實(shí)現(xiàn)輪廓的發(fā)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C語(yǔ)言scanf,fscanf和sscanf的區(qū)別

    C語(yǔ)言scanf,fscanf和sscanf的區(qū)別

    每種語(yǔ)言都對(duì)正則表達(dá)式有著不同程度的支持,在C語(yǔ)言中,有輸入功能的這三個(gè)函數(shù)對(duì)正則表達(dá)式的支持并不強(qiáng)大,但是我們還是有必要了解一下
    2021-10-10
  • 淺析C語(yǔ)言初階的常量和變量

    淺析C語(yǔ)言初階的常量和變量

    在C程序執(zhí)行過(guò)程中,其值不發(fā)生改變的量稱(chēng)為常量,其值可變的量稱(chēng)為變量,本文將帶你了解什么是常量和變量,以及使用方法,需要的朋友可以參考下
    2023-05-05
  • C++實(shí)現(xiàn)教職工信息管理系統(tǒng)課程設(shè)計(jì)

    C++實(shí)現(xiàn)教職工信息管理系統(tǒng)課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)教職工信息管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言版掃雷小游戲

    C語(yǔ)言版掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言版的掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評(píng)論