亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Qt 智能指針QScopedPoint用法小結(jié)

 更新時間:2024年01月19日 15:20:18   作者:FreeLikeTheWind  
智能指針是C++11引入的一種指針封裝類型,用于自動管理動態(tài)分配的內(nèi)存,本文主要介紹了Qt 智能指針QScopedPoint用法小結(jié),感興趣的可以了解一下

1. 智能指針是什么

智能指針是C++11引入的一種指針封裝類型,用于自動管理動態(tài)分配的內(nèi)存。智能指針的目的是解決傳統(tǒng)裸指針帶來的內(nèi)存泄漏、懸掛指針等問題,并使代碼更安全、更易讀。

2. 智能指針有什么用

1.自動管理內(nèi)存,避免內(nèi)存泄漏和懸掛指針問題;
2.簡化代碼,減少異常處理和資源管理的復(fù)雜性;
3.提高代碼可讀性和可維護(hù)性;
4.幫助實(shí)現(xiàn)RAII(資源獲取即初始化)原則,更好地管理資源。

3. 智能指針和普通指針區(qū)別

智能指針和普通指針的主要區(qū)別在于內(nèi)存管理方式。普通指針(裸指針)直接使用內(nèi)存地址,需要手動申請和釋放內(nèi)存,容易導(dǎo)致內(nèi)存泄漏和懸掛指針等問題。而智能指針封裝了內(nèi)存地址,通過自動管理內(nèi)存的方式避免了這些問題。

智能指針內(nèi)部維護(hù)了一個引用計數(shù)器,當(dāng)一個智能指針被創(chuàng)建或拷貝時,計數(shù)器加1;當(dāng)一個智能指針被銷毀或重置時,計數(shù)器減1。當(dāng)計數(shù)器減至0時,智能指針會自動釋放其所指向的內(nèi)存。這種方式稱為“所有權(quán)”(ownership)模型,智能指針具有其內(nèi)存的所有權(quán),避免了普通指針中的多個指針指向同一內(nèi)存地址的情況。

另外,智能指針還提供了一些有用的成員函數(shù),如reset()、release()等,可以更方便地進(jìn)行內(nèi)存管理。同時,智能指針的類型也不同,如std::unique_ptr表示獨(dú)占所有權(quán)的智能指針,std::shared_ptr表示共享所有權(quán)的智能指針,std::weak_ptr表示觀察智能指針等。

4. QScopedPoint介紹

QScopedPointer類用于存儲一個指向動態(tài)分配的對象的指針,并在對象銷毀時自動刪除它。

手動管理堆分配的對象是困難且容易出錯的。常見的后果是代碼內(nèi)存泄漏,難以維護(hù)。QScopedPointer是一個小工具類,通過將基于堆棧的內(nèi)存所有權(quán)分配給堆分配,一般稱資源獲取即初始化(RAII),從而大大簡化了這一點(diǎn)。

QScopedPointer保證當(dāng)當(dāng)前作用域消失時,所指向的對象將被刪除。

當(dāng)使用QScopedPointer時,可以確保在函數(shù)退出時,所分配的對象會被自動刪除,從而避免了內(nèi)存泄漏。這使得代碼更簡潔、更安全,減少了內(nèi)存泄漏和代碼錯誤的風(fēng)險。
比如:一般我們自行new在堆中創(chuàng)建對象時,需手動管理內(nèi)存,如下:

void myFunction(bool useSubClass)
  {
      MyClass *p = useSubClass ? new MyClass() : new MySubClass;
      QIODevice *device = handsOverOwnership();

      if (m_value > 3) {
          delete p;
          delete device;
          return;
      }

      try {
          process(device);
      }
      catch (...) {
          delete p;
          delete device;
          throw;
      }

      delete p;
      delete device;
  }

如果改用智能指針,代碼清晰易懂

void myFunction(bool useSubClass)
  {
      // assuming that MyClass has a virtual destructor
      QScopedPointer<MyClass> p(useSubClass ? new MyClass() : new MySubClass);
      QScopedPointer<QIODevice> device(handsOverOwnership());

      if (m_value > 3)
          return;

      process(device);
  }

如果被const修飾,普通指針與智能指針的對比:

const QWidget *const p = new QWidget();
      // 等同于
      const QScopedPointer<const QWidget> p(new QWidget());

      QWidget *const p = new QWidget();
      // 等同于
      const QScopedPointer<QWidget> p(new QWidget());

      const QWidget *p = new QWidget();
      // 等同于
      QScopedPointer<const QWidget> p(new QWidget());

5. QScopedPoint用法

首先包含頭文件

#include <QScopedPointer>
 
QScopedPointer<int> pInt(new int(99));
    qDebug().noquote() << "*pInt :" << *pInt << *pInt.data(); // 99 99

使用很簡單。

6. take()和data()方法區(qū)別

QScopedPointer 有兩個重要的方法:take() 和 data()。

take() 方法:

  • take() 是一個成員函數(shù),它允許你獲取 QScopedPointer 所指向的對象,并將 QScopedPointer 設(shè)置為 null。這意味著一旦調(diào)用了 take(),QScopedPointer 將不再擁有該對象,并且不再負(fù)責(zé)其生命周期。
  • 這個方法通常用于在多線程環(huán)境中安全地傳遞對象,或者在知道對象生命周期的情況下安全地獲取對象。

data() 方法:

  • data() 返回一個指向所持有對象的指針。這個方法主要用于訪問或修改所指向的對象。
  • 注意,盡管 data() 返回一個指針,但這個指針的生命周期依賴于 QScopedPointer 的生命周期。如果 QScopedPointer 被銷毀,那么這個指針將變得無效。

使用注意事項:

  • 使用 take() 時要特別小心,確保在 take() 之后,不會意外地使用 QScopedPointer,因為這樣可能會導(dǎo)致未定義的行為。
  • 使用 data() 時,要確保在 QScopedPointer 的生命周期內(nèi)使用返回的指針,否則可能會導(dǎo)致懸掛指針或其他問題。
#include <QScopedPointer>  
  
class MyClass {  
public:  
    MyClass() {  
        // 初始化操作  
    }  
    ~MyClass() {  
        // 清理操作  
    }  
    void show() {  
        // 顯示對象內(nèi)容  
    }  
};  
  
int main() {  
    QScopedPointer<MyClass> ptr(new MyClass); // 創(chuàng)建一個 MyClass 對象,QScopedPointer 管理其生命周期  
  
    // 使用 data() 方法訪問對象  
    MyClass* rawPtr = ptr.data(); // 返回原始指針,QScopedPointer 仍然擁有這個對象  
    rawPtr->show(); // 顯示對象內(nèi)容  
  
    // 使用 take() 方法轉(zhuǎn)移對象所有權(quán)  
    MyClass* takenPtr = ptr.take(); // take() 返回原始指針,QScopedPointer 不再擁有這個對象  
    takenPtr->show(); // 顯示對象內(nèi)容,然后釋放 takenPtr,不調(diào)用 MyClass 的析構(gòu)函數(shù)  
  
    return 0;  
}

如下示例:

#include <QScopedPointer>  
  
class MyClass {  
public:  
    MyClass() {  
        // 初始化操作  
    }  
    ~MyClass() {  
        // 清理操作  
    }  
    void show() {  
        // 顯示對象內(nèi)容  
    }  
};  
  
int main() {  
    QScopedPointer<MyClass> ptr(new MyClass); // 創(chuàng)建一個 MyClass 對象,QScopedPointer 管理其生命周期  
  
    // 使用 data() 方法訪問對象  
    MyClass* rawPtr = ptr.data(); // 返回原始指針,QScopedPointer 仍然擁有這個對象  
    rawPtr->show(); // 顯示對象內(nèi)容  
  
    // 使用 take() 方法轉(zhuǎn)移對象所有權(quán)  
    MyClass* takenPtr = ptr.take(); // take() 返回原始指針,QScopedPointer 不再擁有這個對象  
    takenPtr->show(); // 顯示對象內(nèi)容,然后釋放 takenPtr,不調(diào)用 MyClass 的析構(gòu)函數(shù)  
  
    return 0;  
}

到此這篇關(guān)于Qt 智能指針QScopedPoint用法小結(jié)的文章就介紹到這了,更多相關(guān)Qt 智能指針QScopedPoint內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中explict關(guān)鍵字用法

    C++中explict關(guān)鍵字用法

    這篇文章主要介紹了C++中explict關(guān)鍵字用法的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • C語言判斷字符串是否回文三種方法實(shí)例

    C語言判斷字符串是否回文三種方法實(shí)例

    回文就是字符串中心對稱,從左向右讀和從右向左讀的內(nèi)容是一樣的,下面這篇文章主要給大家介紹了關(guān)于C語言判斷字符串是否回文的三種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • C語言定義字符串?dāng)?shù)組簡單代碼示例

    C語言定義字符串?dāng)?shù)組簡單代碼示例

    在C語言中字符串?dāng)?shù)組是用來存儲多個字符串的,可以通過字符數(shù)組或指針數(shù)組的方式定義,這篇文章主要介紹了C語言定義字符串?dāng)?shù)組的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • C語言寫一個散列表

    C語言寫一個散列表

    這篇文章主要介紹了C語言寫一個散列表,散列表,就是下標(biāo)可以為字母的數(shù)組。更多內(nèi)容和小編一起學(xué)習(xí)下面內(nèi)容吧
    2022-01-01
  • C++定時器實(shí)現(xiàn)和時間輪介紹

    C++定時器實(shí)現(xiàn)和時間輪介紹

    這篇文章主要介紹了C++定時器實(shí)現(xiàn)和時間輪介紹,定時器可以由很多種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),比如最小堆、紅黑樹、跳表、甚至數(shù)組都可以,其本質(zhì)都是拿到最小時間的任務(wù),然后取出該任務(wù)并執(zhí)行,更多相關(guān)內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-09-09
  • C++ primer超詳細(xì)講解泛型算法

    C++ primer超詳細(xì)講解泛型算法

    泛型編程,故如其名,是一個泛化的編程方式。其實(shí)現(xiàn)原理為程序員編寫一個函數(shù)/類的代碼示例,讓編譯器去填補(bǔ)出不同的函數(shù)實(shí)現(xiàn)
    2022-07-07
  • C++ 指向類成員的指針

    C++ 指向類成員的指針

    指向類成員的指針總的來講可以分為兩大類四小類(指向數(shù)據(jù)成員還是成員函數(shù),指向普通成員還是靜態(tài)成員)
    2020-03-03
  • 利用C語言實(shí)現(xiàn)頁面置換算法的詳細(xì)過程

    利用C語言實(shí)現(xiàn)頁面置換算法的詳細(xì)過程

    一個好的頁面置換算法,應(yīng)具有較低的頁面更換頻率,從理論上講,應(yīng)該保留最近重復(fù)訪問的頁面,將以后都不再訪問或者很長時間內(nèi)不再訪問的頁面調(diào)出,下面這篇文章主要給大家介紹了關(guān)于利用C語言實(shí)現(xiàn)頁面置換算法的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C語言編程計算信噪比SNR理解學(xué)習(xí)

    C語言編程計算信噪比SNR理解學(xué)習(xí)

    這篇文章主要介紹了C語言編程信噪比SNR計算的理解學(xué)習(xí),信噪比,英文名稱叫做SNR或S/N(SIGNAL-NOISE RATIO)。是指一個電子設(shè)備或者電子系統(tǒng)中信號與噪聲的比例
    2021-10-10
  • C++中stack的pop()函數(shù)返回值解析

    C++中stack的pop()函數(shù)返回值解析

    這篇文章主要介紹了C++中stack的pop()函數(shù)返回值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論