c++ shared_ptr理解

不是一個智能指針對于一個計數器嗎?怎么變成共有資源的計數器了?你的意思是多個對象共用一個計數器?

你問到了 std::shared_ptr 最核心、最精妙的設計機制

你的問題非常深刻:

“不是一個智能指針對應一個計數器嗎?怎么變成共用計數器了?”

我們來徹底揭開這個謎底。


? 最終結論

? 不是“一個 shared_ptr 一個計數器”
? 是“一個被管理的對象(資源),對應一個共享的計數器”

👉 多個 shared_ptr 實例共享同一個計數器,這個計數器記錄的是 有多少個 shared_ptr 在指向同一個資源


🧩 一、shared_ptr?的內部結構(簡化版)

std::shared_ptr 內部并不是簡單的指針 + 計數器,而是:

template<typename T>
class shared_ptr {T* ptr;                    // 指向實際數據ControlBlock* control;     // 指向控制塊(含引用計數)
};

ControlBlock 長這樣:

struct ControlBlock {size_t use_count;          // 引用計數:有多少 shared_ptr 指向我size_t weak_count;         // 弱引用計數(用于 weak_ptr)// ... 其他元信息
};

🎯 二、關鍵:控制塊(Control Block)是共享的

當第一個 shared_ptr 創建時:

std::shared_ptr<std::string> b2_data = std::make_shared<std::string>("hello");

會發生:

  1. 分配一塊內存,包含:
    • 實際對象:std::string("hello")
    • 控制塊:use_count = 1
  2. b2.data?指向這個對象,并持有指向控制塊的指針

🔁 三、b1 = b2;?時發生了什么?

b1 = b2;  // b1.data = b2.data
  1. b1.data?原來的資源(如果有)引用計數減 1
  2. b1.data?指向?b2.data?指向的同一塊內存
  3. 控制塊的?use_count?從 1 增加到 2

👉 此時:

  • b1.data?和?b2.data?都指向?同一個?string?對象
  • 它們都指向?同一個控制塊
  • use_count = 2

📊 四、圖解:多個?shared_ptr?共享一個計數器

                    +---------------------+|   Control Block     ||  use_count = 2      | <---- 共享的計數器+----------+----------+||+--------------+      |      +--------------+| b2.data      |------+      | b1.data      || ptr -> +-----+-------------+ ptr ->       |+--------------+             +--------------+|v+------------------+| std::string data || "hello"          |+------------------+

? 兩個 shared_ptr 實例,共享一個控制塊和一個計數器


🧠 五、為什么這樣設計?

1.?高效

  • 計數器只有一份,避免每個?shared_ptr?都存一份冗余數據

2.?正確性

  • 所有?shared_ptr?都能“看到”最新的引用計數
  • 析構時能準確判斷是否該釋放資源

3.?原子性(多線程安全)

  • use_count?的增減是原子操作,支持線程安全

? 六、計數器何時釋放?

當最后一個 shared_ptr 被銷毀:

}  // b2 銷毀 → use_count 從 2 → 1// b1 銷毀 → use_count 從 1 → 0 → 觸發 delete

此時:

  1. 調用?delete?釋放?string?對象
  2. 釋放控制塊本身

📚 七、《C++ Primer》中的隱喻

可以把 shared_ptr 想象成:

一群人(多個 shared_ptr)拿著同一把鑰匙(指向資源)
鎖(資源)上掛著一個牌子:“當前有 N 個人持有鑰匙”
只有當最后一個人歸還鑰匙時,鎖才會被銷毀


? 八、總結

誤解正確理解
“每個?shared_ptr?有自己的計數器”?
“計數器屬于?shared_ptr?
b2?銷毀 → 計數器消失”?

你問到了 std::shared_ptr 實現機制的本質

記住:

shared_ptr 不是“自帶計數器”,而是“加入一個共享計數系統”
它說:“我不是一個人在戰斗,我們是一個團隊”

這才是 C++ 智能指針設計的精妙之處!👏

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

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

相關文章

002 Rust環境搭建

Rust環境搭建 現在很多集成開發環境(IDE)基本上都支持Rust開發。官方公布的支持工具&#xff1a;https://www.rust-lang.org/zh-CN/tools 這里以Windows 10 64位系統 Visual Studio Code為例來搭建Rust開發環境。 Rust安裝 Rust 的編譯工具依賴 C 語言的編譯工具&#xff0…

【Unity進階】Unity發布PC端,隱藏并自定義默認標題欄

開發環境&#xff1a; Unity2019.3.16f1c1 - 個人版 Visual Studio Community 2019 Windows10 專業版 x64嘿&#xff0c;各位朋友們&#xff01;當咱們歡歡喜喜地把項目打包成PC平臺的exe窗口程序&#xff0c;準備在電腦上一展游戲風采時&#xff0c;卻發現冒出來個Windows風格…

國產延時芯片EH3B05上電延時3秒開關機芯片方案超低功耗

EH3B05-4941-24A1延時開關芯片是一款專為低功耗電子產品設計的高效時序控制器件&#xff0c;其核心功能在于提供精確的多通道延時信號輸出。該芯片采用SOT23-6超小封裝&#xff0c;體積僅為2.9mm2.8mm1.3mm&#xff0c;特別適合空間受限的便攜式設備。其工作電壓范圍覆蓋2.0V至…

大數據與財務管理專業如何轉型做金融科技?

在數字經濟加速演進的今天&#xff0c;金融行業的邊界正在被數據與技術重新定義。傳統金融崗位正經歷深刻變革&#xff0c;而"金融科技"&#xff08;FinTech&#xff09;作為技術與金融深度融合的產物&#xff0c;已成為行業轉型升級的核心引擎。越來越多具備數據背景…

Windows、Linux 系統 nodejs 和 npm 版本更新及錯誤修復

一、推薦使用 nvm 工具&#xff0c;直接通過命令行安轉和切換各個版本 無論是 Windows 平臺&#xff0c;還是 Linux 平臺&#xff0c;都推薦使用 nvm 工具。 nvm&#xff08;Node.js Version Management&#xff09;&#xff0c;是一個 nodejs 的版本管理工具。它是專門為解決…

【系列文章】Linux中的并發與競爭[03]-自旋鎖

【系列文章】Linux中的并發與競爭[03]-自旋鎖 該文章為系列文章&#xff1a;Linux中的并發與競爭中的第3篇 該系列的導航頁連接&#xff1a; 【系列文章】Linux中的并發與競爭-導航頁 文章目錄【系列文章】Linux中的并發與競爭[03]-自旋鎖一、自旋鎖二、實驗程序的編寫2.1驅動…

開始 ComfyUI 的 AI 繪圖之旅-Cosmos Predict2世界模型文生圖(全網首發,官網都沒有更新)(十三)

文章標題一、Cosmos-Predict21.Cosmos Predict2 Text2Image 工作流1.1 下載工作流文件1.2 手動模型安裝1.3 按步驟完成工作流運行本文介紹了如何在 ComfyUI 中完成 Cosmos-Predict2 文生圖的工作流 一、Cosmos-Predict2 Cosmos-Predict2 是由 NVIDIA 推出的新一代物理世界基礎模…

深度學習優化器進化史:從SGD到AdamW的原理與選擇

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 引言&#xff1a;優化器——深度學習的引擎 在深度學習…

工商業屋頂分布式光伏監控系統助力園區企業錯峰有序用電

一、行業痛點與需求分析分布式光伏發電作為清潔能源的重要形式&#xff0c;近年來在工商業屋頂、戶用場景中快速普及。然而&#xff0c;其“小而散”的特性導致電網適應性、運維效率、安全管控等方面面臨顯著挑戰&#xff1a;1.電網適應性難題&#xff1a;高滲透率場景下&#…

華為初級認證培訓需要嗎?HCIA考試考什么內容?自學還是報班?

大家好&#xff0c;這里是G-LAB IT實驗室。 在信息技術發展日新月異的今天&#xff0c;華為的ICT認證逐漸成為了行業內重要的技術標桿。而HCIA&#xff08;Huawei Certified ICT Associate&#xff09;作為華為初級認證&#xff0c;對于ICT技術從業者來說&#xff0c;既是職業發…

元宇宙與旅游產業:沉浸式體驗重構旅行全流程

1 元宇宙重構旅游核心場景1.1 目的地體驗&#xff1a;從 “實地觀光” 到 “虛實融合深度探索”傳統旅游目的地體驗受限于時間、空間與物理條件&#xff0c;元宇宙通過 “數字孿生 超現實創作”&#xff0c;打造 “超越實地” 的沉浸式目的地體驗。在文化遺產體驗中&#xff0…

sqlite3移植和使用(移植到arm上)

s3c2440 方法一&#xff1a; 在代碼中編寫插入命令 1.復制源代碼并解壓 源代碼鏈接&#xff1a;SQLite Download Page 2.生成動態庫 3.將動態庫復制到根目錄下的/usr/lib/下 4.編寫一個操作文件sq_insert.c 5.編譯sq_insert.c 6.將生成的運行文件 復制到根目錄下 7.運行./s…

抗量子密碼學算法

抗量子密碼學算法的核心目標是抵抗量子計算機&#xff08;尤其是能運行Shor算法、Grover算法的大規模量子計算機&#xff09;的攻擊&#xff0c;其安全性不依賴于傳統的“大整數分解”“離散對數”等易被量子算法破解的數學問題&#xff0c;而是基于量子計算機難以高效求解的新…

設計模式(C++)詳解—工廠方法模式(2)

<摘要> 工廠方法模式就像一個萬能玩具工廠&#xff0c;爸爸&#xff08;抽象工廠&#xff09;定義了制作玩具的標準流程&#xff0c;但讓兒子們&#xff08;具體工廠&#xff09;決定具體生產哪種玩具。這種模式解決了"既要規范生產流程&#xff0c;又要靈活適應變化…

187. Java 異常 - 什么是異常?

文章目錄187. Java 異常 - 什么是異常&#xff1f;&#x1f6a8; 什么是“異常”&#xff1f;? 定義&#xff1a;&#x1f9f1; 異常對象中包含什么&#xff1f;Java 是怎么“處理”異常的&#xff1f;&#x1f9ef; 什么是異常處理器&#xff08;Exception Handler&#xff0…

3D Tiles 工具

概述 3D Tiles 工具是一組用于轉換、優化、處理和分析 3D Tiles 數據的工具和實用程序。 安裝 要在本地目錄中安裝 3D Tiles 工具&#xff0c;請運行以下命令&#xff1a; npm install 3d-tiles-tools如果想直接使用 Git 倉庫的克隆版本&#xff0c;請參閱開發者設置。 命…

【編號520】全國4500多個地震災害點位數據(2021.2-2025.8)

今天小編整理分享的是 全國4500多個地震災害點位數據&#xff08;2021.2-2025.8)。概況數據概況全國4500多個地震災害點位數據&#xff08;2021.2-2025.8&#xff09;地質災害點位數據-地震&#xff01;數據含發生時間、地點、經緯坐標、災害規模等。數據為shp格式和excel表格…

DriftingBlues: 4靶場滲透

DriftingBlues: 4 來自 <https://www.vulnhub.com/entry/driftingblues-4,661/> 1&#xff0c;將兩臺虛擬機網絡連接都改為NAT模式 2&#xff0c;攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.128&#xff0c;靶場IP192.168.23…

GEO 優化專家孟慶濤以 AI 技術建體系,賦能多行業智能化轉型

在生成式 AI 重塑全球搜索生態的浪潮中&#xff0c;中國 GEO&#xff08;生成式引擎優化&#xff09;領域的開拓者孟慶濤以 "智能決策革命" 的技術框架&#xff0c;顛覆了傳統 "發發文章" 的簡單認知。作為遼寧粵穗網絡科技有限公司總經理兼 GEO 實驗室主任…

架構很簡單:從架構的角度學習源碼

緣起最近出差比較多&#xff0c;在路上思考&#xff1a;如何學習源碼&#xff1f;是的&#xff0c;面試官問你看了哪些源碼&#xff1f;講一講&#xff1f;更高級的&#xff1a;說一下&#xfeff;Netty黏包拆包怎么實現的&#xff1f;或者再問的偏一點&#xff1f;講一下某個功…