Qt智能指針

在 Qt 框架中,智能指針用于自動管理對象的生命周期,防止內存泄漏。以下是 Qt 中主要的智能指針及其用法詳解:

1.?QScopedPointer

  • 作用:獨占所有權,超出作用域時自動釋放對象(類似?std::unique_ptr)。

  • 特點

    • 不可復制,但可通過?release()?轉移所有權。

    • 適用于局部作用域內的對象管理。

  • 示例

    #include <QScopedPointer>void demo() {QScopedPointer<QObject> ptr(new QObject());ptr->setObjectName("MyObject");// 離開作用域時自動釋放內存
    }

2.?QSharedPointer

  • 作用:共享所有權,基于引用計數(類似?std::shared_ptr)。

  • 特點

    • 多個指針共享同一對象,最后一個指針銷毀時釋放對象。

    • 線程安全(引用計數原子操作)。

  • 示例

    #include <QSharedPointer>void demo() {QSharedPointer<QObject> ptr1(new QObject());QSharedPointer<QObject> ptr2 = ptr1; // 共享所有權// 當 ptr1 和 ptr2 都銷毀時,對象被釋放
    }

3.?QWeakPointer

  • 作用:弱引用,解決?QSharedPointer?的循環引用問題(類似?std::weak_ptr)。

  • 特點

    • 不增加引用計數,不阻止對象銷毀。

    • 需通過?toStrongRef()?轉為?QSharedPointer?后使用。

  • 示例

    #include <QSharedPointer>
    #include <QWeakPointer>void demo() {QSharedPointer<QObject> shared(new QObject());QWeakPointer<QObject> weak = shared;if (!weak.isNull()) {QSharedPointer<QObject> locked = weak.toStrongRef();if (locked) {// 安全使用對象}}
    }

4.?QPointer

  • 作用:專為?QObject?設計的弱指針。

  • 特點

    • 不管理生命周期,僅監控對象是否被銷毀。

    • 對象銷毀后自動置為?nullptr

  • 示例

    #include <QPointer>void demo() {QObject* obj = new QObject();QPointer<QObject> p(obj);delete obj; // 手動刪除對象if (p.isNull()) {qDebug() << "Object has been deleted!";}
    }

5.?QSharedDataPointer

  • 作用:實現隱式共享(Copy-on-Write),用于自定義數據類型。

  • 特點

    • 當數據被修改時自動創建副本(類似?QString?的行為)。

    • 需配合?QSharedData?派生類使用。

  • 示例

    #include <QSharedData>
    #include <QSharedDataPointer>class MyData : public QSharedData {
    public:int value = 0;
    };class MyClass {
    public:QSharedDataPointer<MyData> data;
    };void demo() {MyClass a;a.data->value = 10;MyClass b = a; // 共享數據b.data->value = 20; // 修改時自動復制(COW)
    }

關鍵對比表

智能指針所有權適用場景是否管理生命周期
QScopedPointer獨占局部作用域對象?
QSharedPointer共享跨作用域共享對象?
QWeakPointer無(弱引用)打破循環引用?(僅觀察)
QPointer無(弱引用)監控?QObject?對象存活狀態?(僅觀察)
QSharedDataPointer共享(COW)實現隱式共享的數據類?

最佳實踐建議

  1. 優先使用?QScopedPointer
    對于局部對象,它更輕量且安全。

  2. 避免循環引用
    使用?QWeakPointer?打斷?QSharedPointer?的循環引用。

  3. QObject?的特殊性

    • 若對象有父對象(parent),通常無需智能指針(父對象刪除時自動析構子對象)。

    • 監控?QObject?存活用?QPointer,而非手動檢查?nullptr

  4. 與 STL 智能指針互操作
    Qt 智能指針可與?std::shared_ptr?等交互,但需注意:

    // 將 QSharedPointer 轉為 std::shared_ptr
    QSharedPointer<QObject> qtPtr(new QObject());
    std::shared_ptr<QObject> stdPtr = qtPtr; // 隱式轉換

通過合理使用這些智能指針,可以顯著提升 Qt 程序的內存安全性和代碼健壯性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87889.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87889.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87889.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

408第三季part2 - 計算機網絡 - 信道利用率

理解t1是發送幀的傳輸時間t2是確認幀的傳輸時間中間是傳播過程這整個過程就是發送周期任何題目會有以下幾種情況題目這里數據幀和確認幀長度是一樣的t1 t2然后把t1的傳輸數據算出來然后傳播是0.2sd停止等待 k1確認幀忽略t2 0t1算好后&#xff0c;求數據幀的長度下面是速率&…

Android framework 開發者模式下,如何修改動畫過度模式

Android framework 開發者模式下&#xff0c; 如何修改動畫過度模式 開發者模式下&#xff0c;動畫過度 模式1.0→0.5&#xff0c;按如下方式修改。 開發云 - 一站式云服務平臺 .../core/java/com/android/server/wm/WindowManagerService.java | 8 ---- 1 file changed, …

win11安裝paddlelabel并創建目標檢測項目

創建虛擬環境 conda create -n paddlelabel python3.11.11 conda activate paddlelabel通過以下命令安裝 pip install --upgrade paddlelabel輸入命令pdlabel運行paddlelabel&#xff0c;發現報錯&#xff1a; ModuleNotFoundError: Please install connexion using the flask …

關于Novatek B/G-R/G白平衡色溫坐標系再探究

目錄 一、準備知識 二、色溫坐標系的構建 三、Novatek白平衡色溫坐標系的再探究 2.1 直線白點框 2.2雙曲線白點框 四、仿真代碼 之前寫的一篇博文關于聯詠(Novatek )白平衡色溫坐標系探究-CSDN博客感覺邏輯上有些混亂,這個周末我又好好思考了下,以…

基于路徑質量的AI負載均衡異常路徑檢測與恢復策略

AI流量往往具有突發性、大象流&#xff08;大規模數據流&#xff09;占比高的特點&#xff0c;極易造成網絡擁塞熱點。一條質量不佳&#xff08;如高延遲、高丟包、帶寬受限&#xff09;的路徑&#xff0c;不僅自身無法有效傳輸數據&#xff0c;如果ECMP繼續向其分發流量&#…

ubuntu22.04 安裝cuda cudnn

1.輸入nvidia-smi查看可以支持安裝的cuda最大版本 2.cuda與cudnn版本的選擇 核心原則 向下兼容性&#xff1a;較新的 cuDNN 通常兼容舊版 CUDA&#xff0c;但反之不成立 框架依賴&#xff1a;優先考慮深度學習框架&#xff08;TensorFlow/PyTorch&#xff09;的版本要求 硬件…

5、Receiving Messages:Message Listener Containers

提供了兩個MessageListenerContainer實現&#xff1a; KafkaMessageListenerContainer ConcurrentMessageListener容器 KafkaMessageListenerContainer在單個線程上接收來自所有主題或分區的所有消息。ConcurrentMessageListenerContainer委托給一個或多個KafkaMessageListe…

JDBC 注冊驅動的常用方法詳解

JDBC 注冊驅動的常用方法詳解 在 JDBC 中&#xff0c;注冊驅動是建立數據庫連接的第一步。以下是幾種常用的驅動注冊方式&#xff1a; 1. 顯式類加載&#xff08;傳統方式&#xff09; // 通過 Class.forName() 加載驅動類 Class.forName("com.mysql.cj.jdbc.Driver&qu…

插入數據優化

目錄 一.插入數據優化 1.insert語句優化 ①批量插入 ②手動提交事務 ③主鍵順序插入 2.大批量插入數據&#xff08;100萬條&#xff09; 舉例 第一步&#xff1a;連接數據庫時&#xff0c;加上--local-infile屬性 第二步&#xff1a;查看全局參數local_infile的值&…

區塊鏈在域名系統安全中的應用進展綜述

一、區塊鏈與DNS結合的核心原理1.1 傳統DNS的安全缺陷中心化架構&#xff1a;傳統DNS依賴中心化服務器&#xff08;如ICANN管理的根服務器&#xff09;&#xff0c;存在單點故障風險&#xff0c;易受DDoS攻擊或配置錯誤影響。協議脆弱性&#xff1a;DNS協議設計之初缺乏加密和認…

GO Web 框架 Gin 完全解析與實踐

目錄 1. 為什么選擇 Gin?解鎖 Go Web 開發的超能力 Gin 的核心優勢 什么時候用 Gin? 第一個 Hello World 2. 路由的藝術:從簡單 GET 到復雜匹配 基礎路由 高級路由技巧 性能優化小貼士 3. 中間件的魔法:讓請求處理更聰明 內置中間件 自定義中間件 中間件的最佳實…

RabbitMQ使用topic Exchange實現微服務分組訂閱

案例場景&#xff1a;用戶下單后需要多個微服務&#xff08;如營銷、會員&#xff09;分別訂閱并處理訂單事件&#xff0c;且每個微服務可能有多個集群實例&#xff0c;需要保證同一個微服務的集群中&#xff0c;只有一個實例消費到消息。不同于Kafka和rocketMQ有分組消費的功能…

kotlin 通道trysend方法

trySend 方法是 Kotlin 協程中 Channel 類的一個重要功能。它用于向通道發送元素&#xff0c;但與 send 方法不同的是&#xff0c;trySend 是非阻塞的。這意味著它不會在通道滿時掛起當前協程&#xff0c;而是會立即返回。 trySend 方法的效果 非阻塞行為&#xff1a; 當你調用…

winform CheckedListBox單擊選中解決方案

在WinForms的CheckedListBox控件中&#xff0c;默認需要雙擊才能切換選中狀態&#xff08;復選框勾選&#xff09;。要實現單擊即選中&#xff0c;需要通過代碼處理鼠標點擊事件并手動切換選中狀態。以下是實現步驟&#xff1a; 1.CheckOnClick屬性置為true即可。 2.通過事件處…

Docker文件操作、數據卷、掛載

一&#xff1a;容器文件操作 在Docker環境中&#xff0c;管理容器內部的文件是一個常見的需求。 無論是為了配置應用、備份數據還是調試問題&#xff0c;了解如何高效地進行文件操作都是非常重要的。 docker cp命令提供了一種簡單的方法來在宿主主機和容器之間復制文件或目錄…

接口漏洞怎么抓?Fiddler 中文版 + Postman + Wireshark 實戰指南

接口安全是現代應用開發中的高危環節&#xff1a;一旦API存在未授權訪問、參數篡改、權限繞過等漏洞&#xff0c;可能直接導致用戶信息泄露、資金損失甚至整個平臺癱瘓。對于開發和安全人員來說&#xff0c;光依賴后端日志排查遠遠不夠&#xff0c;需要對接口進行主動安全性驗證…

iOS 出海 App 安全加固指南:無源碼環境下的 IPA 加固與防破解方法

隨著越來越多國內開發團隊將iOS App推向海外市場&#xff0c;如何在交付和分發環節保護應用安全成為出海過程中的重要議題。尤其是App進入多個海外應用商店或通過第三方渠道發行時&#xff0c;容易被當地黑產或競爭對手進行逆向分析&#xff0c;從而暴露內部API、核心業務流程等…

React Hooks 內部實現原理與函數組件更新機制

React Hooks 內部實現原理與函數組件更新機制 Hooks 的內部實現原理 React Hooks 的實現依賴于以下幾個關鍵機制&#xff1a; 1. 鏈表結構存儲 Hook 狀態 React 使用單向鏈表來管理 Hooks 的狀態。每個 Hook 節點包含&#xff1a; type Hook {memoizedState: any, // 存儲…

分布式會話的演進和最佳實踐,含springBoot 實現(Java版本)

一、分布式會話的背景 在微服務架構或集群部署環境下&#xff0c;請求可能落在不同的服務器節點&#xff0c;無法再依賴本地內存來維護用戶 Session。因此&#xff0c;需要一種跨節點共享 Session 的機制&#xff0c;這就是 分布式會話管理的核心目標。二、分布式會話的演進歷程…

ch03 部分題目思路

G. 收集 由于稀有度相同的物品需要一起處理&#xff0c;我們先把他們聚集到一起。 類似這樣&#xff1a; vector<int> g[maxn]; ... {cin >> x >> c;g[c].push_back(x); }那么我們需要一個貪心的思路&#xff1a; 肯定是按 ccc 從小往大收集的&#xff1b;對…