智能指針(Smart Pointers)

定義

智能指針(Smart Pointers)是C++中的一種高級特性,它提供了一種自動管理動態分配內存的機制。通過智能指針,開發者可以避免手動管理內存所帶來的問題,如內存泄漏和懸掛指針等。智能指針的主要目的是確保當對象不再需要時,其內存能夠被自動釋放。

C++標準庫提供了幾種智能指針類型,包括std::unique_ptrstd::shared_ptrstd::weak_ptrstd::auto_ptr(注意,std::auto_ptr在C++11中已被棄用,并在C++17中被移除)。

示例

std::unique_ptr

std::unique_ptr是一個獨占所有權的智能指針。它擁有它所指向的對象,并且該對象在同一時間只能被一個unique_ptr擁有。當unique_ptr被銷毀(例如離開其作用域)時,它所指向的對象也會被自動刪除。

#include <memory>  void foo() {  std::unique_ptr<int> ptr(new int(42)); // 分配內存  // 使用 ptr...  // 當 ptr 離開作用域時,它所指向的內存會被自動釋放  
}

std::shared_ptr

std::shared_ptr允許多個智能指針共享同一個對象的所有權。內部使用引用計數來追蹤共享對象的所有權。當最后一個shared_ptr被銷毀時,它所指向的對象才會被刪除。

#include <memory>  void bar() {  std::shared_ptr<int> sptr1(new int(42)); // 分配內存  std::shared_ptr<int> sptr2 = sptr1; // 復制構造,增加引用計數  // 當 sptr1 和 sptr2 都離開作用域時,內存才會被釋放  
}

std::weak_ptr

std::weak_ptr是一種不控制對象生命周期的智能指針,它指向一個由shared_ptr管理的對象。weak_ptr用于解決shared_ptr之間的循環引用問題。

#include <memory>  struct A;  
struct B;  struct A {  std::shared_ptr<B> b;  ~A() {}  
};  struct B {  std::weak_ptr<A> a;  ~B() {}  
};  void baz() {  std::shared_ptr<A> a = std::make_shared<A>();  std::shared_ptr<B> b = std::make_shared<B>();  a->b = b;  b->a = a;  // 當 a 和 b 離開作用域時,內存會被正確釋放,即使存在循環引用  
}

std::auto_ptr(已棄用)

std::auto_ptr是一個早期的智能指針實現,它在C++98中被引入,但在C++11中被標記為棄用,并在C++17中被移除。auto_ptr有一個所有權轉移語義,這意味著當auto_ptr被復制時,所有權會從源auto_ptr轉移到目標auto_ptr,源auto_ptr會失去所有權并變為空。由于這個所有權轉移語義,auto_ptr在使用上容易導致混淆和錯誤,因此被unique_ptrshared_ptr所取代。

智能指針的優缺點

優點:

  • 自動管理內存,減少內存泄漏和懸掛指針的風險。
  • 簡化內存管理代碼,提高代碼的可讀性和可維護性。
  • 提供了多種所有權模型,適應不同的使用場景。

缺點:

  • 智能指針的使用可能會引入額外的性能開銷(盡管通常這些開銷是微不足道的)。
  • 需要正確理解和使用智能指針的所有權模型,以避免出現意外的行為。

總的來說,智能指針是C++中一個非常重要的特性,它幫助開發者更加安全和高效地管理動態內存。在選擇使用哪種智能指針時,應該根據具體的使用場景和需求來做出決策。

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

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

相關文章

【力扣hot100】刷題筆記Day17

前言 今天竟然不用開組會&#xff01;天大的好消息&#xff0c;安心刷題了 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 回溯&#xff08;排列&#xff09; class Solution:def permute(self, nums: List[int]) -> List[List[int]]:# 回溯def backtrack():if len(…

C++學習第四天(類與對象下)

1、構造函數的其他知識 構造函數體賦值 在創建對象時&#xff0c;編譯器通過調用構造函數&#xff0c;給對象中各個成員變量一個合適的初始值 構造函數調用之后&#xff0c;對象中已經有了一個初始值&#xff0c;但是不能將其稱為對對象中成員變量的初始化&#xff0c;構造函…

Nginx+keepalived 高可用高性能

什么是高可用: 在使用 Nginx 做反向代理或者負載均衡的時候,都是以 Nginx 為入口,如果 Nginx 宕機了,那么所有的服務都無法正常提供,影響非常嚴重。所有我們需要保證 nginx 高可用,就是配置備份機,前一個掛了,還有后一個。 為了避免負載均衡服務器宕機造成嚴重影響,…

關于游戲報錯提示x3daudio1_7.dll丟失怎么修復?多個實測有效方法分享

x3daudio1_7.dll 是一個與 Microsoft DirectX 相關的重要動態鏈接庫&#xff08;DLL&#xff09;文件&#xff0c;它主要服務于Windows操作系統下的多媒體和游戲應用程序。 一、以下是關于 x3daudio1_7.dll 文件的詳細介紹 名稱與位置&#xff1a; 文件名&#xff1a;x3daud…

PHP堆棧+errLog定位

調用堆棧&#xff08;Call Stack&#xff09;是一個記錄了程序在運行時所有活動子例程的棧結構。它以函數調用的方式描述了程序的執行流程和調用關系。 在PHP中&#xff0c;我們可以通過打印PHP調用堆棧來輔助調試和定位代碼中的問題。本文將介紹如何在PHP中打印調用堆棧&…

探秘Python的Pipeline魔法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站AI學習網站。 目錄 前言 什么是Pipeline&#xff1f; Pipeline的基本用法 Pipeline的高級用法 1. 動態調參 2. 并行處理 3. 多輸出 …

Spring底層源碼分析

spring依賴注入底層原理解析 spring之bean對象生命周期步驟詳情 流程&#xff1a; UserService.class —>推斷構造方法—>普通對象----依賴注入------>初始化&#xff08;afterPropertiesSet方法&#xff09;------>初始化后&#xff08;AOP&#xff09;------…

Zabbix“專家坐診”第231期問答

問題一 Q&#xff1a;用docker-compose部署zabbix&#xff0c;部署完后如果要修改zabbix的配置應該要改docker-compose文件里的環境變量吧&#xff1f;改了環境變量之后只能重建容器才能生效嗎&#xff1f;能不能在不影響已經配好的那些監控項的情況下讓新的環境變量生效&#…

洛谷P1331海戰

題目背景 在峰會期間&#xff0c;武裝部隊得處于高度戒備。警察將監視每一條大街&#xff0c;軍隊將保衛建筑物&#xff0c;領空將布滿了 F-2003 飛機。 此外&#xff0c;巡洋船只和艦隊將被派去保護海岸線。不幸的是&#xff0c;因為種種原因&#xff0c;國防海軍部僅有很少…

win安裝卸載python3.13

一、安裝 訪問python官網&#xff1a;https://www.python.org/ 點擊“Downloads” 點擊“Windows” 找到自己要下載的版本和位數&#xff0c;比如我這個是3.13版本、64位的安裝包 下載好了之后&#xff0c;雙擊安裝包 勾選“Add python.exe to PATH”&#xff1a;把python環…

[記錄]-PyCharm中的Unresolved Reference疾病專治

轉載https://blog.csdn.net/qq_36166962/article/details/115905359?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170930227516800227476736%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id170930227516800227476736&biz_i…

作業1-224——P1331 海戰

思路 深搜的方式&#xff0c;讓它只遍歷矩形塊&#xff0c;然后在下面的遍歷中判斷是否出現矩形塊交叉&#xff0c;但是很難實現&#xff0c;然后發現可以通過在遍歷過程中判斷是否合法。 參考代碼 #include<iostream> #include<cstdio> using namespace std; …

SQLSERVER 2014 刪除數據庫定時備份任務提示失敗DELETE 語句與 REFERENCE 約束“FK_subplan_job_id“沖突

SQLSERVER 2014 刪除數據庫定時備份任務提示失敗DELETE 語句與 REFERENCE 約束“FK_subplan_job_id“沖突 &#xff0c;錯誤如圖&#xff1a; 問題原因&#xff1a;不能直接刪除作業 任務&#xff0c;需要先刪除計劃里面的日志、刪除代理作業、刪除子計劃以后才能刪除作業。 解…

藍橋杯:真題講解3(C++版)附帶解析

報紙頁數 來自&#xff1a;2016年七屆省賽大學C組真題&#xff08;共8道題) 分析&#xff1a; --畫出報紙長的樣子&#xff0c;如果我們在上面多畫一張報紙&#xff0c;那么就符合題意的5&#xff0c;6&#xff0c;11&#xff0c;12。 觀察這張圖&#xff1a;觀察3&#xf…

VUE3子組件實例方法暴露(導出)方法

最近很多朋友私我請教子組件實例的獲取方法 解答&#xff1a; vue2中可直接通過父組件內組件的ref讀取子組件的實例&#xff0c;vue3有些許區別 vue3中需要在子組件中導出&#xff08;暴露&#xff09;相關實&#xff08;你需要再父組件中調用&#xff09;例方法&#xff1a;…

力扣:35. 搜索插入位置

力扣&#xff1a;35. 搜索插入位置 描述 給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法。 示例 1: 輸入: nums [1,…

Mybatis | Mybatis的核心配置

目錄: Mybatis的核心配置 :一、MyBatis的 “核心對象”1.1 SqlSessionFactory1.2 SqlSession :SqlSession對象中的操作數據庫的方法 :\<T> T selectOne ( String statement )\<T> T selectOne( String statement , Object parameter )\<E> List\<E> se…

SpringBoot基于注解實現全局日期格式化

首先根據項目要求提供自定義的日期序列化器和反序列化器&#xff0c;其中包括&#xff1a; DateJsonSerializerextendsJsonSerializer 表示將Date格式化為日期字符串。DateJsonDeserializerextendsJsonDeserializer 表示將日期字符串解析為Date日期。 使用注解 JsonComponent…

openGauss學習筆記-232 openGauss性能調優-系統調優-資源負載管理-資源管理準備-資源規劃

文章目錄 openGauss學習筆記-232 openGauss性能調優-系統調優-資源負載管理-資源管理準備-資源規劃 openGauss學習筆記-232 openGauss性能調優-系統調優-資源負載管理-資源管理準備-資源規劃 完成資源負載管理功能配置前&#xff0c;需要先根據業務模型完成租戶資源的規劃。業…

紹興市新昌縣人大一行蒞臨迪捷軟件走訪考察

2024年2月29日下午&#xff0c;紹興市新昌縣人大常委會副主任王敏慧一行蒞臨迪捷軟件走訪考察&#xff0c;紹興市委科創委副主任、科創走廊建設領導小組副組長、市人大一級巡視員王繼崗&#xff0c;紹興市科技局副局長、科創走廊建設辦公室常務副主任梁楓陪同。 王主任一行聽取…