最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt 智能指針QScopedPoint用法小結

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

1. 智能指針是什么

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

2. 智能指針有什么用

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

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

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

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

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

4. QScopedPoint介紹

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

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

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

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

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

data() 方法:

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

使用注意事項:

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

如下示例:

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

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

相關文章

  • C語言中獲取文件狀態(tài)的相關函數小結

    C語言中獲取文件狀態(tài)的相關函數小結

    這篇文章主要介紹了C語言中獲取文件狀態(tài)的相關函數小結,包括stat()函數和fstat()函數以及l(fā)stat()函數的使用,需要的朋友可以參考下
    2015-09-09
  • C語言實現靜態(tài)鏈表的方法

    C語言實現靜態(tài)鏈表的方法

    分享一段代碼,一個靜態(tài)鏈表的C語言實現,其中包含著一種簡單的內存管理策略:固定大小的鏈式管理。
    2013-03-03
  • C語言調用攝像頭生成avi視頻程序

    C語言調用攝像頭生成avi視頻程序

    這篇文章主要為大家詳細介紹了C語言如何調用攝像頭生成avi視頻程序,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2023-11-11
  • C++基本用法實踐之智能指針詳解

    C++基本用法實踐之智能指針詳解

    為了減少手動管理內存帶來的困擾,c++提出了智能指針,可以幫助我們進行內存管理,下面小編就來和大家簡單聊聊C++中智能指針的基本用法吧
    2023-07-07
  • VC++ 使用 _access函數判斷文件或文件夾是否存在

    VC++ 使用 _access函數判斷文件或文件夾是否存在

    這篇文章主要介紹了VC++ 使用 _access函數判斷文件或文件夾是否存在的相關資料,需要的朋友可以參考下
    2015-10-10
  • 關于C++函數模版的實現講解

    關于C++函數模版的實現講解

    今天小編就為大家分享一篇關于關于C++函數模版的實現講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言實現打飛機小游戲

    C語言實現打飛機小游戲

    這篇文章主要為大家詳細介紹了C語言實現簡單的打飛機小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++中強類型枚舉(scoped enumeration)的實現

    C++中強類型枚舉(scoped enumeration)的實現

    C++11引入的強類型枚舉解決了傳統(tǒng)枚舉的三大缺陷:作用域污染、隱式類型轉換和底層類型不確定,本文就來詳細的介紹一下強類型枚舉的使用,感興趣的可以了解一下
    2025-11-11
  • C++去除輸入行中空白的方法

    C++去除輸入行中空白的方法

    這篇文章主要介紹了C++去除輸入行中空白的方法,涉及C++針對數組的遍歷與替換的相關使用技巧,需要的朋友可以參考下
    2015-07-07
  • C++使用模板實現單鏈表

    C++使用模板實現單鏈表

    這篇文章主要為大家詳細介紹了C++使用模板實現單鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評論

安泽县| 融水| 临洮县| 石棉县| 米易县| 黎城县| 华池县| 邹城市| 开化县| 双城市| 镇安县| 潞西市| 岳阳县| 荆门市| 若羌县| 蕉岭县| 凤冈县| 龙泉市| 台东县| 漳平市| 祥云县| 克什克腾旗| 贺州市| 无棣县| 思茅市| 桦甸市| 精河县| 泾川县| 土默特右旗| 东源县| 宜阳县| 什邡市| 临洮县| 勐海县| 雷波县| 仁布县| 蛟河市| 牡丹江市| 仁怀市| 吉林市| 偏关县|