RAII資源管理理解

基礎介紹

RAII (Resource Acquisition Is Initialization) 是一種 C++ 編程范式,這不是一個語法特性,而是一種處理方式。RAII的思想:

  1. 資源獲取與對象初始化同時發生
  2. 資源釋放與對象銷毀同時發生
  3. 通過對象的生命周期來管理資源,確保資源的安全使用

怎么理解RAII呢?前面說了這不是一種庫特性,更像是一種約定,一種管理資源的方式,c++標準庫某些庫特性提供了RAII資源給管理的特性,用戶自己設計的類型也可以按照RAII的思想進行設計。

RAII特點

自動資源管理

這是一個核心的特點,核心就是資源管理,要確保資源的獲取和銷毀與對象的生命周期一致。通過這個特點可以實現資源的自動清理,防止資源泄露。請看下面的例子:

class FileHandler
{private:FILE* file;public: //構造函數獲取資源FileHandler(char* filename){    file = fopen(filename, "r");if(!file) throw std::runtime_error("failed to open file");}//析構函數釋放資源~FileHandler(){if(file)fclose(file);}};

異常安全

void processFile() {FileHandler fh("data.txt");  // 獲取資源// 如果這里拋出異常,FileHandler的析構函數仍會被調用// 確保文件被正確關閉doSomething();
} // 作用域結束,自動調用析構函數釋放資源

常見的RAII應用場景

智能指針

智能指針std::unique_ptr<T>在實現中就采用了RAII的變成范式,當創建這個指針被構造函數構造時,就會獲取資源,當std::unique_ptr<T>變量聲明周期結束時,就會自動釋放該指針對應的對象。注意std::shared_ptr<T>變量不時RAII的思想,這種類型的變量是需要根據引用計數的數量來決定資源是否釋放。示例如下所示:

class Resource {
public:void doWork() { /* ... */ }
};void foo() {std::unique_ptr<Resource> ptr(new Resource()); // RAII管理動態內存ptr->doWork();// 不需要手動刪除,unique_ptr析構時會自動刪除
}

互斥鎖的管理

class Lock
{private:std::mutex& mtx;public:Lock(std::mutex& m):mtx(m){mtx.lock();  //構造時加鎖}~Lock(){mtx.unlock();  //析構時解鎖}
};void funtion()
{std::mutex mtx;Lock lock(mtx);   //此處加鎖.....
}//函數結束自定解鎖

數據庫連接

class DBConnection {
private:Connection* conn;
public:DBConnection(const std::string& connectionString) {conn = DatabaseConnect(connectionString);if (!conn) throw std::runtime_error("Connection failed");}~DBConnection() {if (conn) {DatabaseDisconnect(conn);}}
};

優秀實踐

不要使用裸指針

這里不使用裸指針的意思是,如果使用裸指針就需要自己管理這個裸指針的釋放,如有可能盡可能使用一些智能指針,比如std::unique_ptr<T>,也可以使用std::shared_ptr<T>。請看下面的 例子:

Resource* source = new Resource();
.......  //業務邏輯
delete source;   //手動釋放資源std::unique_ptr<Resource> res = std::make_unique<Resource>();//生命周期結束自動結束

使用標準的RAII工具

  1. 智能指針:std::unique_ptr std::shared_ptr std::weak_ptr
  2. 互斥鎖和線程同步:std::lock_guard<T> std::unique_lock std::scoped_lock std::shared_lock
  3. 標準容器:所有的標準容器都是RAII的,如set map vecotor等

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

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

相關文章

解鎖元生代:ComfyUI工作流與云原生后端的深度融合

目錄 藍耘元生代&#xff1a;智算新勢力崛起? ComfyUI 工作流創建詳解? ComfyUI 初印象? 藍耘平臺上搭建 ComfyUI 工作流? 構建基礎工作流實操? 代碼示例與原理剖析? 云原生后端技術全景 云原生后端概念解析? 核心技術深度解讀? 藍耘元生代中兩者的緊密聯系?…

實戰篇|多總線網關搭建與量產驗證(5000 字深度指南)

引言 1. 環境準備與硬件選型 1.1 項目需求分析 1.2 SoC 與開發板選型 1.3 物理接口與 PCB 設計 1.4 電源與供電保護 2. 軟件架構與協議棧移植 2.1 分層架構詳解 2.2 協議棧移植步驟 2.3 高可用驅動設計 2.4 映射邏輯與 API 定義 3. 開發流程與實踐 3.1 敏捷迭代與里程碑 3.2 核…

Kafka安全認證技術:SASL/SCRAM-ACL方案詳解

#作者 &#xff1a;張桐瑞 文章目錄 1Kafka安全認證技術介紹2基礎設置3 配置SASL/SCRAM認證3.1編寫server.properties配置3.2編寫kafka.conf密碼文件3.3編寫user.properties配置文件3.4編寫kafka-run-class.sh腳本文件3.5Zk中增加kafka用戶3.6啟動kafka進程 1Kafka安全認證技術…

TCP/IP和UDP協議的發展歷程

TCP/IP和UDP協議的發展歷程 引言 互聯網的發展史是人類技術創新的輝煌篇章&#xff0c;而在這一發展過程中&#xff0c;通信協議發揮了奠基性的作用。TCP/IP&#xff08;傳輸控制協議/互聯網協議&#xff09;和UDP&#xff08;用戶數據報協議&#xff09;作為互聯網通信的基礎…

PhotoShop學習10

1.畫板功能的使用 使用畫板功能可以輕松針對不同的設備和屏幕尺寸設計網頁和 APP。畫板是一種容器&#xff0c;類似于特殊圖層組。畫板中的圖層在圖層面板中&#xff0c;按畫板進行分組。 使用畫板&#xff0c;一個文檔中可以有多個設計版面&#xff0c;這樣可以在畫板之間輕…

X-AnyLabeling開源程序借助 Segment Anything 和其他出色模型的 AI 支持輕松進行數據標記。

一、軟件介紹 文末提供源碼和程序下載學習 使用 X-AnyLabeling開源程序可以 導入、管理和保存數據。用戶可以通過多種方式導入圖像和視頻文件&#xff0c;包括快捷方式或菜單選項。此外&#xff0c;它還涵蓋數據刪除、圖像切換以及標簽和圖像數據的保存&#xff0c;以確保高效…

【深度解析】PlatformIO多環境配置實踐:ESP32/ESP32-S3/ESP32-C3適配指南

一、前言&#xff1a;為什么需要多環境配置&#xff1f; 在物聯網開發中&#xff0c;我們經常需要適配不同型號的硬件平臺&#xff08;如ESP32系列&#xff09;,并且github上多數關于ESP32的都適配了多種開發板。傳統開發方式需要為每個平臺維護獨立項目&#xff0c;而Platfor…

React 列表渲染基礎示例

React 中最常見的一個需求就是「把一組數據渲染成一組 DOM 元素」&#xff0c;比如一個列表。下面是我寫的一個最小示例&#xff0c;目的是搞清楚它到底是怎么工作的。 示例代碼 // 定義一個靜態數組&#xff0c;模擬后續要渲染的數據源 // 每個對象代表一個前端框架&#xf…

NHANES指標推薦:CMI

文章題目&#xff1a;Association between cardiometabolic index and biological ageing among adults: a population-based study DOI&#xff1a;10.1186/s12889-025-22053-3 中文標題&#xff1a;成年人心臟代謝指數與生物衰老之間的關系&#xff1a;一項基于人群的研究 發…

QT調用ffmpeg庫實現視頻錄制

可以通過QProcess調用ffmpeg命令行,也可以直接調用ffmpeg庫,方便。 調用庫 安裝ffmpeg ffmpeg -version 沒裝就裝 sudo apt-get update sudo apt-get install ffmpeg sudo apt-get install ffmpeg libavdevice-dev .pro引入庫路徑,引入庫 LIBS += -L/usr/lib/aarch64-l…

消息中間件——RocketMQ(二)

前言&#xff1a;此篇文章系本人學習過程中記錄下來的筆記&#xff0c;里面難免會有不少欠缺的地方&#xff0c;誠心期待大家多多給予指教。 RocketMQ&#xff08;一&#xff09; 接上期內容&#xff1a;上期完成了RocketMQ單機部署知識。下面學習RocketMQ集群相關知識&#xf…

pyqt環境配置

文章目錄 1 概述2 PyQt6和PySide6區別3 環境配置4 配置PySide65 配置PyQt66 配置外部工具7 添加模板8 使用pyside6-project構建工程9 常見錯誤10 相關地址 更多精彩內容&#x1f449;內容導航 &#x1f448;&#x1f449;Qt開發 &#x1f448;&#x1f449;python開發 &#x1…

金融數據庫轉型實戰讀后感

榮幸收到老友太保科技有限公司數智研究院首席專家林春的簽名贈書。 這是國內第一本關于OceanBase數據庫實際替換過程總結的的實戰書。打個比方可以說是從戰場上下來分享戰斗經驗。讀后感受頗深。我在這里講講我的感受。 第三章中提到的應用改造如何降本。應用改造是國產化替換…

旅游資源網站登錄(jsp+ssm+mysql5.x)

旅游資源網站登錄(jspssmmysql5.x) 旅游資源網站是一個為旅游愛好者提供全面服務的平臺。網站登錄界面簡潔明了&#xff0c;用戶可以選擇以管理員或普通用戶身份登錄。成功登錄后&#xff0c;用戶可以訪問個人中心&#xff0c;進行修改密碼和個人信息管理。用戶管理模塊允許管…

STM32 HAL庫之WDG示例代碼

獨立看門狗&#xff08;IWDG&#xff09; 在規定時間內按按鍵喂狗并將LED關閉&#xff0c;若產生看門狗復位則LED打開 初始化獨立看門狗&#xff0c;在main.c中的 MX_IWDG_Init();&#xff0c;也就是iwdg.c中的初始化代碼 void MX_IWDG_Init(void) {/* USER CODE BEGIN IWDG…

【第47節】windows程序的其他反調試手段下篇

目錄 一、利用Hardware Breakpoints Detection 二、PatchingDetection - CodeChecksumCalculation 補丁檢測&#xff0c;代碼檢驗和 三、block input 封鎖鍵盤、鼠標輸入 四、使用EnableWindow 禁用窗口 五、利用ThreadHideFromDebugger 六、使用Disabling Breakpoints 禁…

【筆記ing】AI大模型-03深度學習基礎理論

神經網絡&#xff1a;A neural network is a network or circuit of neurons,or in a modern sense,an artificial neural network,composed of artificial neurons or nodes.神經網絡是神經元的網絡或回路&#xff0c;或者在現在意義上來說&#xff0c;是一個由人工神經元或節…

基于Djiango實現中藥材數據分析與可視化系統

中藥材數據分析與可視化系統 項目截圖 登錄 注冊 首頁 藥材Top20 藥材價格 產地占比 歷史價格 新聞資訊 后臺管理 一、項目概述 中藥材數據分析與可視化系統是一個基于Django框架開發的專業Web應用&#xff0c;致力于對各類中藥材數據進行全面、系統的采集、分析和可視化展示…

【AI飛】AutoIT入門七(實戰):python操控autoit解決csf視頻批量轉換(有點難,AI都不會)

背景&#xff1a; 終極目標&#xff1a;通過python調用大模型&#xff0c;獲得結果&#xff0c;然后根據返回信息&#xff0c;控制AutoIT操作電腦軟件&#xff0c;執行具體工作。讓AI更具有執行力。 已完成部分&#xff1a; 關于python調用大模型的&#xff0c;可以參考之前的…

leetcode 188. Best Time to Buy and Sell Stock IV

目錄 題目描述 第一步&#xff0c;明確并理解dp數組及下標的含義 第二步&#xff0c;分析明確并理解遞推公式 1.求dp[i][j].holding 2.求dp[i][j].sold 第三步&#xff0c;理解dp數組如何初始化 第四步&#xff0c;理解遍歷順序 代碼 題目描述 這道題把第123題推廣為一…