Effective C++ 條款17:以獨立語句將newed對象置入智能指針

Effective C++ 條款17:以獨立語句將newed對象置入智能指針


核心思想使用智能指針管理動態分配的對象時,必須確保new操作與智能指針構造在同一獨立語句中完成,避免編譯器優化順序導致的內存泄漏。

?? 1. 跨語句初始化的危險性

資源泄漏場景

// 危險:跨語句初始化智能指針
processWidget(std::shared_ptr<Widget>(new Widget), riskyFunction());

編譯器可能的執行順序

  1. 執行 new Widget(分配內存)
  2. 調用 riskyFunction()(可能拋出異常)
  3. 構造 shared_ptr(管理資源)

風險分析

  • riskyFunction() 拋出異常 → 步驟1分配的Widget對象內存泄漏
  • shared_ptr 尚未接管資源 → 無自動釋放機制

🚨 2. 解決方案:獨立語句初始化

安全初始化模式

// 正確:獨立語句完成資源分配和智能指針構造
std::shared_ptr<Widget> pw = std::make_shared<Widget>(); // 推薦方式// 或顯式new+智能指針構造(同一語句)
std::shared_ptr<Widget> pw(new Widget); // 安全構造processWidget(pw, riskyFunction()); // 異常安全調用

現代C++最佳實踐

// 優先使用std::make_shared(C++11+)
auto pw = std::make_shared<Widget>(); // 需自定義刪除器時:
auto pw = std::shared_ptr<Widget>(new Widget, customDeleter);

?? 3. 關鍵原則與注意事項
原則說明違反后果
單語句構造原則new操作與智能指針構造必須在同一獨立語句完成資源泄漏風險
優先make_shared/make_unique使用工廠函數保證異常安全(C++11/14)消除顯式new
避免函數參數內構造禁止在函數調用參數列表內直接new+智能指針構造編譯器重排風險
擴展至所有資源管理類規則同樣適用于自定義RAII類通用資源安全原則

編譯器優化陷阱

C++標準允許編譯器重排函數參數求值順序(未指定順序)

// 編譯器可能的重排順序:
1. new Widget        // 分配資源
2. riskyFunction()   // 可能拋出異常
3. shared_ptr構造    // 未執行 → 資源泄漏

自定義RAII類的安全用法

// 自定義資源管理類
class DBConnection { /* ... */ };
class DBHandler {
public:explicit DBHandler(DBConnection* conn) : conn_(conn) {}~DBHandler() { conn_->close(); }
private:DBConnection* conn_;
};// 安全初始化:
DBConnection* dbc = new DBConnection;  // 危險:分離語句
DBHandler handler(dbc);                 // 可能泄漏// 正確:同一語句完成
DBHandler handler(new DBConnection);    // 異常安全

💡 關鍵原則總結

  1. 異常安全第一原則
    • 動態資源必須立即被資源管理對象接管
    • new操作與RAII對象構造必須原子化完成
  2. make函數優先原則
    • std::make_shared<>()(C++11)
    • std::make_unique<>()(C++14)
    • 避免顯式new操作
  3. 禁用復雜參數表達式
    • 禁止在函數調用參數內組合new與智能指針構造
    • 禁用多步操作初始化智能指針

錯誤用法重現

// 危險:可能泄漏資源的寫法
processResource(std::unique_ptr<Resource>(new Resource), // 風險點loadConfig() // 可能拋出異常
);

安全重構方案

// 方案1:獨立語句構造(基礎)
auto res = std::unique_ptr<Resource>(new Resource);
processResource(std::move(res), loadConfig());// 方案2:make_unique(推薦,C++14+)
auto res = std::make_unique<Resource>();
processResource(std::move(res), loadConfig());// 方案3:延遲調用(異常安全封裝)
auto callProcess = [](auto&&... args) {auto res = std::make_unique<Resource>();processResource(std::move(res), std::forward<decltype(args)>(args)...);
};
callProcess(loadConfig());

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

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

相關文章

Linux iptables防火墻操作

資料&#xff1a; 網絡運維相關 - iptables 【Main】 https://www.zsythink.net/archives/tag/iptables/ netfilter 在 Linux 內核 TCP/IP協議棧中的位置 【框架】【Aulaxiry】 https://zhuanlan.zhihu.com/p/93630586 1 概念詳解 ● 防火墻概念 ○ 主機防火墻 網絡防火墻 ○…

飛書推送工具-自動化測試發送測試報告一種方式

飛書推送工具 要獲取飛書開發所需的 APP_ID、APP_SECRET 以及用戶的 USER_ID&#xff0c;需通過飛書開放平臺和飛書客戶端的相關設置操作。以下是詳細步驟&#xff1a; 一、獲取 APP_ID 和 APP_SECRET&#xff08;飛書應用憑證&#xff09; APP_ID 和 APP_SECRET 是飛書開放…

從零開始的云計算生活——第三十七天,跬步千里,ansible之playbook

目錄 一.故事劇情 二.Playbook簡介 三.Playbook核心元素(重要) 四.Playbook語法 五.Playbook的運行方式 六.Playbooks中tasks語法使用 1、file 2、lineinfile 3、replace 4、shell 5、debug 6、template/copy 7、fetch 8、unarchive 9、wait_for 10、yum 11、…

AI驅動下的數據新基建:騰訊游戲數據資產治理與湖倉架構革新

在大模型技術迅猛發展的今天&#xff0c;AI 正深度重塑數據基礎設施&#xff0c;推動其向智能化快速演進。如何將 AI 深度融入數據管理&#xff0c;釋放數據的潛在價值、提升運營效率&#xff0c;成為企業在構建 AI 驅動的數據資產管理體系的核心問題。在近期舉辦的“DataFun A…

ubuntu 系統風扇控制軟件 CoolerControl

背景 A6000顯卡的溫度一直都是86度左右&#xff0c;GPU的風扇轉速不夠大。 我首先把 nvidia的驅動更新了&#xff0c;但是發現風扇依然依然保持在較低的轉速。 后面無意間搜到了CoolerControl 這個linux平臺的風扇控制軟件。設置之后&#xff0c;增加了風扇的轉速&#xff0c;…

Oracle 11gR2 Clusterware應知應會

Oracle 11gR2 Clusterware應知應會 關鍵特性 啟動順序 日志路徑 資源狀態 資源管理 關鍵特性 ?? Oracle 11gR2 Clusterware的一些關鍵特性如下: 在安裝運行11gR2的Real Application Clusters數據庫之前需要先安裝11gR2 Clusterware。 GRID home包括Oracle Clusterware和AS…

微信小程序蘋果手機和安卓,怎么做適配

1. 基于 rpx 單位進行布局適配微信小程序采用 rpx 作為尺寸單位&#xff0c;以實現不同設備的布局適配。小程序的屏幕寬度固定為 750rpx&#xff0c;在不同設備上通過動態計算 1rpx 對應的像素值進行適配。例如&#xff0c;在 iPhone 6 中&#xff0c;屏幕寬度為 375px&#xf…

XGBoost三部曲:XGBoost參數詳解

之前已經介紹了XGBoost三部曲:XGBoost原理。本文詳細介紹XGBoost參數,讓大家在使用XGBoost的過程中能得心應手。后續會更新XGBoost實戰,敬請期待。 文章目錄 一、核心概念回顧 二、XGBoost算法參數整體介紹 1 原生接口和Scikit-learn接口的區別 2 參數分類詳解 三、核心Boos…

【python】轉移本地安裝的python包

我們現在需要將某個環境已經安裝的 python 包離線傳遞到另外一個環境&#xff0c;且確保這種安裝行為最終不需要對 PYPI 中央倉庫的有效連接&#xff0c;也能完成。下面給出兩種辦法&#xff1a; docker container 如果你的 python 環境位于某個容器內&#xff0c;那最好的辦法…

TGD第十篇:當神經網絡遇到TGD特征

目錄一、實驗背景二、實驗設置三、實驗結果和分析四、結語TGD 是我們定義的一種新的“變化率表征”&#xff0c;對連續函數而言是一種新的“廣義導數”&#xff0c;對離散序列而言是一種新的差分。TGD 是一個名字&#xff0c;一個代號。在基于 TGD 的圖像邊緣檢測以及視頻邊緣檢…

FreeRTOS源碼分析二:task啟動(RISCV架構)

系列文章目錄 FreeRTOS源碼分析一&#xff1a;task創建&#xff08;RISCV架構&#xff09; 文章目錄系列文章目錄前言vTaskStartScheduler 調度器啟動函數xPortStartScheduler架構特定調度器啟動函數vPortSetupTimerInterrupt啟動 RISCV 定時器中斷xPortStartFirstTask啟動第一…

Python編程基礎與實踐:Python基礎運算符與表達式入門

Python運算符與表達式實戰 學習目標 通過本課程的學習&#xff0c;學員可以掌握Python中算術運算符、比較運算符、邏輯運算符及賦值運算符的使用方法&#xff0c;并能夠構建簡單的表達式來解決實際問題。 相關知識點 Python運算符與表達式 學習內容 1 Python運算符與表達式 1.1…

Git下載全攻略(未更新完)

一、在 Windows 上安裝 Git? ??? 1.1 下載安裝包? 官方版本可在 Git 官方網站下載,打開Redirecting…,下載會自動開始。此安裝包來自名為 Git for Windows 的項目(也稱作 msysGit),它與 Git 本身是相互獨立的項目,更多相關信息可訪問Redirecting Git for Windows…

rocky\centos安裝docker鏡像的命令

1.安裝依賴&#xff1a; sudo yum install -y yum-utils device-mapper-persistent-data lvm22. 選擇倉庫源&#xff1a; sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo阿里源&#xff1a; sudo yum-config-manager --add-r…

扣子,正式擁抱開源!

資料來源&#xff1a;火山引擎-開發者社區 扣子 是新一代 AI Agent 平臺&#xff0c;旗下有四款子產品&#xff1a;「扣子空間」、「扣子開發平臺」、「扣子羅盤」 及 Eino 。 我們始終堅信&#xff0c;AI Agent 的未來屬于每一位開發者和創造者。為了讓前沿的 AI 技術能夠更快…

Git 各場景使用方法總結

以下是對 Git 各場景使用方法的全面總結,涵蓋 20+ 核心場景和 100+ 命令,包含詳細參數、使用示例及原理說明: 一、基礎操作場景 1. 倉庫初始化 # 本地初始化 git init git init --bare # 創建裸倉庫(無工作區) git init -b main # 指…

國際標準組織共聚,智源推動全球AI開源與國際標準雙輪驅動人工智能普惠化發展

7 月 26 日&#xff0c;人工智能標準化國際合作論壇在上海召開。該論壇由聯合國工業發展組織全球工業人工智能聯盟卓越中心主辦&#xff0c;中國電子技術標準化研究院、上海人工智能研究院承辦&#xff0c;工業和信息化部副部長單忠德、國家市場監督管理總局標準創新管理司司長…

《安富萊嵌入式周報》第356期:H7-TOOL的250M示波器模組批量生產中,自主開發QDD執行器,開源14bit任意波形發生器(2025-07-28)

周報匯總地址&#xff1a;嵌入式周報 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬漢嵌入式論壇 - Powered by Discuz! 視頻版 《安富萊嵌入式周報》第356期&#xff1a;H7-TOOL的250M示波器模組批量生產中&#xff0c;自主開發QDD執行器&a…

大模型學習專欄-導航頁

概要 本專欄是小編系統性調研大模型過程中沉淀的知識結晶&#xff0c;涵蓋技術原理、實踐應用、前沿動態等多維度內容。為助力讀者高效學習&#xff0c;特整理此導航頁&#xff0c;以清晰脈絡串聯核心知識點&#xff0c;搭建起系統的大模型學習框架&#xff0c;助您循序漸進掌握…

leetcode熱題——組合

組合題目描述給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。你可以按 任何順序 返回答案。示例 1&#xff1a; 輸入&#xff1a;n 4, k 2 輸出&#xff1a; [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4] ]示例 2&#xff1a; 輸入&#xff1a;…