Effective C++ 條款15:在資源管理類中提供對原始資源的訪問

Effective C++ 條款15:在資源管理類中提供對原始資源的訪問


核心思想RAII類需要提供訪問其封裝原始資源的顯式或隱式接口,以兼容需要直接操作資源的API,同時維持資源的安全管理。

?? 1. 原始資源訪問的必要性

使用場景示例

// 需要原始資源的API
void legacyAPI(Resource* rawPtr); // RAII封裝類
ResourceHandle handle(new Resource());// 問題:如何將handle傳遞給legacyAPI?
legacyAPI(handle); // 編譯錯誤!

根本矛盾

  • RAII類封裝資源 → 提升安全性
  • 大量遺留代碼需要原始資源 → 需安全訪問接口

🚨 2. 解決方案:顯式與隱式轉換

兩種安全訪問方式

方式實現特點示例
顯式訪問提供get()成員函數安全、意圖明確legacyAPI(handle.get());
隱式轉換重載operator->()/operator*代碼簡潔、接近裸指針使用體驗legacyAPI(&*handle);
或自定義類型轉換運算符便利但可能引發意外轉換legacyAPI(handle);

代碼實現對比

// 方案1:顯式訪問(推薦)
class ResourceHandle {
public:Resource* get() const { return ptr; } // 顯式接口
private:Resource* ptr;
};// 方案2:隱式轉換(謹慎使用)
class ResourceHandle {
public:operator Resource*() const { return ptr; } // 隱式轉換運算符
};

?? 3. 關鍵原則與注意事項
原則說明風險
優先顯式訪問使用get()明確傳遞原始資源 → 避免隱式錯誤隱式轉換可能導致意外類型推導
智能指針兼容std::unique_ptr/shared_ptr自帶get()無需重復造輪子
隱式轉換三思僅在確保安全時重載->/*或類型轉換運算符可能破壞封裝性
保持資源所有權訪問原始資源時RAII類仍需保持資源生命周期管理警惕懸空指針

標準庫實踐

// 智能指針原生支持
auto ptr = std::make_unique<Resource>();
ptr->doSomething();    // 隱式訪問 (operator->)
Resource* raw = ptr.get(); // 顯式訪問// 自定義RAII類的安全訪問
class DBConnectionHandle {
public:explicit DBConnectionHandle(Database* db) : conn(db) {}// 顯式訪問Database* get() const noexcept { return conn; }// 隱式訪問(按需實現)Database* operator->() const { return conn; }Database& operator*() const { return *conn; }private:Database* conn;
};

💡 關鍵原則總結

  1. 顯式訪問優先原則
    • 提供get()成員函數 → 明確傳遞原始資源指針
    • 避免隱式轉換的不可控風險
  2. 隱式訪問的適用場景
    • 重載operator->operator* → 模擬指針行為
    • 謹慎使用類型轉換運算符 → 確保使用場景安全
  3. 所有權不變性
    • 原始資源訪問不轉移所有權 → RAII對象仍負責釋放資源
    • 禁止通過原始資源指針進行delete

錯誤示例診斷:隱式轉換的陷阱

void process(Resource* r1, Resource* r2);ResourceHandle handle1(new Resource);
ResourceHandle handle2(new Resource);process(handle1, handle2); // 若定義隱式轉換:意外比較指針地址!

安全修復方案

// 方案1:禁用隱式轉換 + 顯式訪問
process(handle1.get(), handle2.get());// 方案2:僅重載->和*(不提供指針轉換)
handle1->doSomething(); // 安全,無法直接獲取指針地址

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

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

相關文章

Linux 進程管理與計劃任務設置

Linux 進程管理與計劃任務設置一、進程管理進程管理用于監控、控制系統中運行的程序&#xff08;進程&#xff09;&#xff0c;包括查看進程狀態、調整優先級、終止異常進程等。以下是核心命令及操作說明&#xff1a;1. 常用進程查看命令&#xff08;1&#xff09;ps&#xff1…

MYSQL數據庫之索引

1、引入索引的問題在圖書館查找一本書的過程&#xff0c;可類比數據庫查詢場景。在一般軟件系統中&#xff0c;對數據庫操作以查詢為主&#xff0c;數據量較大時&#xff0c;優化查詢是關鍵&#xff0c;索引便是優化查詢的重要手段 。2、索引是什么索引是一種特殊文件&#xff…

ArcGIS以及ArcGIS Pro如何去除在線地圖制作者名單

問題&#xff1a;ArcGIS和ArcGIS Pro提供了許多在線地圖服務&#xff0c;但是這些地圖會自動生成制作者名單&#xff0c;如下圖所示&#xff1a; 在線地圖加載方式可參考&#xff1a;如何在ArcGIS和ArcGIS Pro中添加在線底圖 這在出圖時有時會造成圖的部分信息遮擋或出圖不美觀…

InfluxDB 與 Golang 框架集成:Gin 實戰指南(二)

四、實際應用案例4.1 案例背景某智能工廠部署了大量的物聯網設備&#xff0c;如傳感器、智能儀表等&#xff0c;用于實時監測生產線上設備的運行狀態、環境參數&#xff08;如溫度、濕度&#xff09;以及生產過程中的各項指標&#xff08;如產量、次品率&#xff09;。這些設備…

Linux系統磁盤未分配的空間釋放并分配給 / 根目錄的詳細操作【openEuler系統】

選擇 Fix 修正 GPT 表 輸入 Fix 并按回車&#xff0c;parted 會自動&#xff1a; 擴展 GPT 表的 結束位置 到磁盤末尾。釋放未被使用的空間&#xff08;1048576000 個 512B 塊&#xff0c;約 500GB&#xff09;。 驗證修正結果 修正后&#xff0c;再次運行&#xff1a; parted …

王道考研-數據結構-01

數據結構-01視頻鏈接&#xff1a;https://www.bilibili.com/video/BV1b7411N798?spm_id_from333.788.videopod.sections&vd_source940d88d085dc79e5d2d1c6c13ec7caf7&p2 數據結構到底在學什么? 數據結構這門課他要學習的就是怎么用程序代碼把現實世界的問題給信息化&…

k8s云原生rook-ceph pvc快照與恢復(上)

#作者&#xff1a;Unstopabler 文章目錄前言部署rook-ceph on kubernets條件Ceph快照概述什么是PVC安裝快照控制器和CRD1.安裝crds資源2.安裝控制器3.安裝快照類前言 Rook 是一個開源的云原生存儲編排器&#xff0c;為各種存儲解決方案提供平臺、框架和支持&#xff0c;以便與…

springcloud04——網關gateway、熔斷器 sentinel

目錄 注冊中心 nacos | eurekaServer |zookeeper(dubbo) 配置中心 nacos | config Server 遠程服務調用 httpClient | RestTemplate | OpenFeign 負載均衡服務 ribbon | loadbalancer 網關 zuul | gateway 熔斷器 hystrix | sentinel 網關 sentinel 流控 壓測工具 1…

XSS跨站腳本攻擊詳解

一、XSS攻擊簡介跨站腳本攻擊的英文全稱是Cross-Site Scripting&#xff0c;為了與CSS有所區別&#xff0c;因此縮寫為“XSS”由于同源策略的存在&#xff0c;攻擊者或者惡意網站的JavaScript代碼沒有辦法直接獲取用戶在其它網站的信息&#xff0c;但是如果攻擊者有辦法把惡意的…

Linux /proc/目錄詳解

文章目錄前言文件說明注意事項前言 在 Linux 系統中&#xff0c;/proc 目錄是一個特殊的虛擬文件系統&#xff0c;它提供了對系統內核和進程的訪問。/proc 目錄中的文件和目錄不是真實存在的&#xff0c;它們是在運行時由內核動態生成的&#xff0c;用于提供系統和進程的相關信…

北斗變形監測在地質災害監測中的應用

內容概要 北斗形變監測系統在地質災害監測領域發揮著核心作用&#xff0c;該系統基于北斗衛星導航技術&#xff0c;實現對地表變形的精確追蹤。通過毫米級精度定位能力&#xff0c;北斗形變監測技術為滑坡等災害提供關鍵數據支撐&#xff0c;尤其在偏遠地區應用中&#xff0c;單…

2025新征程杯全國54校園足球錦標賽在北京世園公園隆重開幕

2025年8月1日&#xff0c;備受矚目的2025新征程杯全國54校園足球錦標賽&#xff08;北京&#xff09;在北京世園公園盛大拉開帷幕。開幕式上&#xff0c;中國關心下一代健康體育基金會副秘書長、中國青少年研究會理事、全國 54 校園足球人才培養計劃創始人何占強主任表示&#…

分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測

分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測 目錄分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測分類效果基本介紹程序設計分類效果 基本介紹 1.Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測&#xff0c;運…

機器學習——邏輯回歸(LogisticRegression)的核心參數:以約會數據集為例

理解 LogisticRegression 的核心參數&#xff1a;以約會數據集為例 邏輯回歸&#xff08;Logistic Regression&#xff09;是機器學習中一種基礎且重要的分類算法&#xff0c;特別適用于解決二分類和多分類問題。本文將基于 sklearn.linear_model.LogisticRegression 的用法&a…

深入解析 Apache Flink FLIP-511:優化 Kafka Sink 事務處理,減輕 Broker 負載

一、 背景與核心問題&#xff1a;Kafka Sink 事務的痛點 Flink Kafka Sink 在 Exactly-Once 模式下依賴 Kafka 事務來確保數據寫入的原子性&#xff0c;并與 Flink 檢查點對齊。然而&#xff0c;非優雅關閉&#xff08;如任務失敗、非 stop-with-savepoint 的停止&#xff09;會…

設計模式:組合模式 Composite

目錄前言問題解決方案結構代碼前言 組合是一種結構型設計模式&#xff0c;你可以使用它將對象組合成樹狀結構&#xff0c;并且能像使用獨立對象一樣使用它們。 問題 如果應用的核心模型能用樹狀結構表示&#xff0c; 在應用中使用組合模式才有價值。 例如&#xff0c; 你有兩…

嵌入式 C 語言入門:函數封裝與參數傳遞學習筆記 —— 從定義到內存機制

前言 大家好&#xff0c;這里是 Hello_Embed。在前一篇筆記中&#xff0c;我們用循環實現了 LED 閃爍&#xff0c;其中重復使用了兩段幾乎一樣的延時代碼&#xff1a; for(i 0; i < 100000000; i); // 延時這種重復不僅讓代碼冗余&#xff0c;還不利于后續修改&#xff08…

第一個大語言模型的微調

模型推理 現在,我們的模型應該能夠針對輸入的任何短句生成類似尤達大師風格的句子作為回應。 該模型要求其輸入格式規范。我們需要構建一個 “消息” 列表 —— 在這個案例中,就是來自用戶的消息 —— 并通過提示表明輪到模型進行輸出,以促使其做出回答。 add_generation…

Linux內核驅動開發核心問題全解

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry Linux內核驅動開發核心問題全解 本文系統梳理了 Linux 驅動開發、內核同步、中斷處理、內存管理、進程通信、系統啟動等典型…

【C++篇】C++11入門:踏入C++新世界的大門

文章目錄C11簡介列表初始化1. {}初始化2. initializer_list容器initializer_list的使用場景聲明1. auto2. decltype3. nullptrSTL中的變化1. 新容器array容器forward_list容器unordered_map和unordered_set容器2. 新接口C11簡介 C98/03&#xff1a;在2003年C標準委員會曾經提交…