深入理解C++ std::shared_ptr:現代C++內存管理的藝術與實踐

在C++的發展歷程中,內存管理始終是開發者面臨的核心挑戰。從C語言繼承而來的手動內存管理方式,雖然提供了極大的靈活性,卻也成為無數程序錯誤的根源。內存泄漏、懸空指針、雙重釋放等問題長期困擾著C++開發者,直到智能指針的出現改變了這一局面。作為C++11標準引入的重要特性,std::shared_ptr代表了共享所有權模型的精髓,徹底革新了我們管理對象生命周期的方式。
在這里插入圖片描述

內存管理的演進:從手動到智能

傳統C++中,程序員需要精確地配對每一個newdelete操作,這種手動內存管理在簡單情況下尚可應付,但在復雜的軟件系統中卻顯得力不從心。異常安全、多線程環境、復雜的數據結構等因素使得跟蹤每一個對象的生命周期變得異常困難。

std::shared_ptr的引入標志著一個重要的轉變:從程序員手動管理內存到讓對象自己管理自己的生命周期。這種自動內存管理的核心思想是RAII(資源獲取即初始化)原則,將資源的生命周期與對象的生命周期綁定,通過析構函數自動釋放資源。

引用計數:共享所有權的核心技術

std::shared_ptr實現共享所有權的關鍵在于引用計數機制。每個由std::shared_ptr管理的對象都會關聯一個控制塊,其中包含引用計數器。當新的shared_ptr指向同一對象時,計數器增加;當shared_ptr被銷毀或重置時,計數器減少。當計數器歸零時,對象被自動銷毀。

這種機制的優雅之處在于它的完全自動化——系統根據所有權關系自動做出正確的生命周期決策,無需程序員手動干預。更重要的是,引用計數的操作是原子性的,保證了在多線程環境下的安全性。

實踐中的智慧:正確使用shared_ptr

理解理論后,正確實踐變得至關重要。以下是一個完整的示例,展示了std::shared_ptr的基本用法、引用計數變化、自定義刪除器以及在容器中的使用:

#include <iostream>
#include <memory> // 必須包含此頭文件
#include <vector>// 一個簡單的類,用于觀察構造和析構
class MyClass {
public:MyClass(int value) : data(value) {std::cout << "MyClass constructed with value: " << data << std::endl;}~MyClass() {std::cout << "MyClass destroyed with value: " << data << std::endl;}void print() const

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

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

相關文章

一個 WPF 文檔和工具窗口布局容器

一個 WPF 文檔和工具窗口布局容器、用于排列文檔 和工具窗口的方式與許多知名 IDE 類似&#xff0c;例如 Eclipse、Visual Studio、 PhotoShop 等等 AvalonDock 是一個 WPF 文檔和工具窗口布局容器&#xff0c;用于排列文檔 和工具窗口的方式與許多知名 IDE 類似&#xff0c;例…

【qml-5】qml與c++交互(類型單例)

背景&#xff1a; 【qml-1】qml與c交互第一次嘗試&#xff08;實例注入&#xff09; 【qml-2】嘗試一個有模式的qml彈窗 【qml-3】qml與c交互第二次嘗試&#xff08;類型注冊&#xff09; 【qml-4】qml與c交互&#xff08;類型多例&#xff09; 【qml-5】qml與c交互&#…

循環神經網絡(RNN)、LSTM 與 GRU (一)

循環神經網絡&#xff08;RNN&#xff09;、LSTM 與 GRU &#xff08;一&#xff09; 文章目錄循環神經網絡&#xff08;RNN&#xff09;、LSTM 與 GRU &#xff08;一&#xff09;循環神經網絡&#xff08;RNN&#xff09;、LSTM 與 GRU一、RNN&#xff08;Recurrent Neural N…

【AAOS】Android Automotive 16模擬器源碼下載及編譯

源碼下載repo init -u https://android.googlesource.com/platform/manifest -b android-16.0.0_r2 repo sync -c --no-tags --no-clone-bundle源碼編譯source build/envsetup.sh lunch sdk_car_x86_64-bp2a-eng make -j8運行效果emualtorHomeAll appsSettingsHAVCNotification…

jvm三色標記

好的&#xff0c;咱們把專業概念和生活例子結合起來&#xff0c;一步一步說清楚三色標記法&#xff1a;一、核心概念&#xff1a;用“顏色”給對象貼“狀態標簽”就像給家里的物品貼標簽&#xff0c;每種顏色代表它在“垃圾回收&#xff08;大掃除&#xff09;”中的狀態&#…

生成式AI的能力邊界與職業重構:從“百科實習生“到人機協作增強器

根據微軟最新研究&#xff0c;基于20萬條Copilot使用數據及用戶反饋&#xff0c;研究者揭示了生成式AI在實際應用中的能力邊界與職業影響。數據顯示&#xff0c;用戶使用AI助手最頻繁的任務是信息獲取&#xff08;占比近40%&#xff09;&#xff0c;其次是公眾溝通類工作&#…

java17學習筆記

Java17是一個重要的特性發布&#xff0c;也是比較常用的一個版本&#xff0c;根據 2024Java生態統計&#xff0c;Java 17、11 和 8 的用戶比例分別為 35%、33% 和 29%。它遵循了自Java10以來引入的Java發布步調&#xff0c;并于2021年 9 月 14 日發布&#xff0c;在Java16發布后…

【AI應用】修改向量數據庫Milvus默認密碼

說明&#xff1a; 1&#xff09;部署向量數據庫milvus運行一段時間后&#xff0c;想開啟密碼認證登錄attu頁面 2&#xff09;開啟密碼認證登錄&#xff0c;提示用戶和密碼不正確&#xff0c;因為默認密碼已存儲在物理機 3&#xff09;通過attu管理頁面修改向量數據庫milvus默認…

分布式系統消息隊列:可靠投遞與延時消息實戰

在分布式系統架構中&#xff0c;消息隊列&#xff08;MQ&#xff09;作為解耦服務、削峰填谷、異步通信的核心組件&#xff0c;其消息投遞的可靠性與延時消息的精準性直接影響業務系統的穩定性。本文結合實際業務場景&#xff0c;詳細解析消息投遞的全流程設計與延時消息的通用…

Java 學習筆記(基礎篇6)

面向對象基礎1. 類和對象(1) 示例&#xff1a;public class Student {String name "張三";int age 23;public void study() {System.out.println("學習 Java");}public void eat() {System.out.println("吃飯");} }public class Test {public …

光學件加工廠倚光科技:陪跑光學未來力量

在光學創新的漫漫長路上&#xff0c;總有一些看似 “不劃算” 的堅持&#xff0c;卻在悄然改寫行業的未來。倚光科技的故事&#xff0c;就始于這樣一種選擇 —— 明知光學打樣利潤微薄&#xff0c;明知上百個項目中能走到量產的寥寥無幾&#xff0c;仍愿意投入全球頂尖的設備與…

RabbitMQ:生產者可靠性(生產者重連、生產者確認)

目錄一、生產者重連二、生產者確認一、生產者重連 當網絡不穩定的時候&#xff0c;利用重試機制可以有效提高消息發送的成功率。不過SpringAMQP提供的重試機制是阻塞式的重試&#xff0c;也就是說多次重試過程中&#xff0c;當前線程是被阻塞的&#xff0c;會影響業務性能。 …

【深度學習新浪潮】空天地數據融合技術在城市三維重建中的應用

空天地數據融合技術在城市三維重建中的應用已取得顯著進展,尤其在提升精度以滿足具身智能機器人仿真訓練需求方面,研究和產品均呈現多樣化發展。以下是關鍵研究進展、產品方案及精度要求的詳細分析: 一、研究進展與技術路徑 1. 多源數據融合的技術突破 時空基準統一:通過…

Selenium自動化測試入門:cookie處理

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快driver.get_cookies() # 獲得cookie 信息driver.get_cookies(name) # 獲得對應name的cookie信息add_cookie(cookie_dict) # 向cookie 添加會話信息delete_cookie(na…

快解析如何讓遠程訪問更安全?

一、勒索病毒攻擊服務器的途徑很多用戶服務器對外開放&#xff0c;實現外網訪問&#xff0c;擔心服務器被勒索病毒攻擊&#xff01;勒索病毒攻擊服務器的途徑之一是通過路由器開放的端口進行掃描攻擊&#xff0c;所以盡量不要在服務器的路由器和防火墻中開放端口二、快解析如何…

Linux下編譯ARPACK

本文記錄Linux下編譯ARPACK的流程。 零、環境 操作系統Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、依賴 1.1 安裝oneAPI 參見&#xff1a;Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 二、編譯ARPACK …

芋道RBAC實現介紹

說明&#xff1a;之前寫過一篇博客&#xff0c;介紹如何搭建一個基于角色的權限驗證框架 搭建一個基于角色的權限驗證框架 本文介紹在非常受歡迎的開源框架——芋道中是如何實現 RBAC 的&#xff0c;芋道的部署參考下面這篇文章&#xff1a; 芋道微服務代碼部署 介紹 一般…

Docker部署Jellyfin,沒有公網IP如何使用內網穿透遠程訪問?

Jellyfin是一款完全開源、免費的媒體服務器&#xff0c;可幫助你快速搭建屬于自己的私人流媒體平臺&#xff1a;電影、劇集、音樂、照片統統收納&#xff0c;跨設備隨點隨播。本文將以最簡潔的步驟&#xff0c;演示如何在Docker容器中部署Jellyfin&#xff0c;并通過貝銳花生殼…

Podman:Mysql(使用卷)

下載鏡像hpphcomp:~$ podman pull docker.1ms.run/mysql:latest Trying to pull docker.1ms.run/mysql:latest... Getting image source signatures Copying blob c81e70a25040 done | Copying blob 31f7d8dc4024 done | Copying blob b9916866e45f done | Copying blob …

2025年滲透測試面試題總結-21(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 一、文件上傳繞過方式&#xff08;Top 5&#xff09; 二、文件包含高危函數&#xff08;PHP為例&#xff0…