為什么需要智能指針

參考自https://www.cnblogs.com/round1/p/12906648.html

主要為了避免以下Bug:

內存泄露? ?:對象無法被釋放,最常見的問題。
野指針? ? ? ?: 指針指向未知。
重復釋放? ?:? ? 顧名思義。

?


?

(一)內存泄露 :?

?1. 拋出異常,函數中途退出,釋放操作沒有執行

C * c = new C;
throw; //拋出
delete c; //沒有執行

2 . 忘記釋放

注意:? 指針變量(值語義)一旦被銷毀,所指向的對象(對象語義)將無法釋放

void f()
{C * c = new C();
   //delete c; //忽略 }

?

結果:內存無法釋放,直到壓榨完程序的所以內存。

?

(二)野指針 :

1. 未初始化

C * c;//指向哪呢???

2.? 指針變量指向的對象被釋放后,指針就變成了野指針,注意:即使釋放完馬上置空,仍然非常容易出錯。

C * c = new C();
C * c2 = c;

delete c;
c = nullptr; //釋放并置空
//c2 = nullptr
c2非常容易被忽略。你永遠不知道有多少個c2, c3,在什么地方存在這些指針。

?

結果:未定義,不可預測的行為

?

(三)重復釋放 :

c2 = c;
delete c; delete c2;

??

結果:程序異常結束。

?


?

 智能指針

上一章提到,值語義對象作為局部變量,存儲在棧區,生命周期由程序管理,因此值語義可以作為資源句柄

這個技術叫做RALL,在資源句柄的構造函數進行資源初始化,在析構函數進行資源釋放


智能指針,就是值語義的資源句柄。將對象語義轉為值語義,至少從抽象的角度看起來是這樣。

?

智能指針是解決了以上的問題嗎?

1. 因為智能指針是值語義的,所以保證不發生內存泄露和重復釋放。

2. 智能指針執行默認初始化和智能指針一定在對象銷毀之前銷毀,所以不可能出現野指針。

?

?

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

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

相關文章

leetcode1068. 產品銷售分析 I(SQL)

銷售表 Sales: -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------------- (sale_id, year) 是銷售表…

多進程與多線程通信同步機制

多進程通信方式 管道pipe:管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。命名管道FIFO:有名管道也是半雙工的通信方式,但是它允許無親緣關…

leetcode1069. 產品銷售分析 II(SQL)

銷售表:Sales -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------------- sale_id 是這個表的主鍵。…

leetcode1070. 產品銷售分析 III(SQL)

銷售表 Sales: -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------------- sale_id 是此表的主鍵。 …

C/C++中static的用法全局變量與局部變量

轉載自C/C中static的用法全局變量與局部變量 1.什么是static? static 是C/C中很常用的修飾符,它被用來控制變量的存儲方式和可見性。 1.1static的引入 我們知道在函數內部定義的變量,當程序執行到它的定義處時,編譯器為它在棧上分配空間&…

查看商品圖片,鼠標懸浮圖片放大js實現

2010-06-07 10:18:46|分類&#xff1a;Javascript|字號訂閱 <%pagelanguage"java"import"java.util.*"pageEncoding"UTF-8"%> <%pageimport"com.pojo.Products"%> <% String path request.getContextPath(); String b…

leetcode547. 朋友圈

班上有 N 名學生。其中有些人是朋友&#xff0c;有些則不是。他們的友誼具有是傳遞性。如果已知 A 是 B 的朋友&#xff0c;B 是 C 的朋友&#xff0c;那么我們可以認為 A 也是 C 的朋友。所謂的朋友圈&#xff0c;是指所有朋友的集合。 給定一個 N * N 的矩陣 M&#xff0c;表…

C++中volatile關鍵字

轉載https://blog.csdn.net/weixin_44363885/article/details/92838607 一、volatile介紹 volatile提醒編譯器它后面所定義的變量隨時都有可能改變&#xff0c;因此編譯后的程序每次需要存儲或讀取這個變量的時候&#xff0c;都會直接從變量地址中讀取數據。如果沒有volatile…

leetcode261. 以圖判樹

給定從 0 到 n-1 標號的 n 個結點&#xff0c;和一個無向邊列表&#xff08;每條邊以結點對來表示&#xff09;&#xff0c;請編寫一個函數用來判斷這些邊是否能夠形成一個合法有效的樹結構。 示例 1&#xff1a; 輸入: n 5, 邊列表 edges [[0,1], [0,2], [0,3], [1,4]] 輸…

leetcode323. 無向圖中連通分量的數目

給定編號從 0 到 n-1 的 n 個節點和一個無向邊列表&#xff08;每條邊都是一對節點&#xff09;&#xff0c;請編寫一個函數來計算無向圖中連通分量的數目。 示例 1: 輸入: n 5 和 edges [[0, 1], [1, 2], [3, 4]] 0 3 | | 1 --- 2 4 輸出…

leetcode79. 單詞搜索 網格地圖搜索+回溯經典寫法啦

給定一個二維網格和一個單詞&#xff0c;找出該單詞是否存在于網格中。 單詞必須按照字母順序&#xff0c;通過相鄰的單元格內的字母構成&#xff0c;其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。 示例: board [ [A,B,C…

leetcode1075. 項目員工 I(SQL)

項目表 Project&#xff1a; ---------------------- | Column Name | Type | ---------------------- | project_id | int | | employee_id | int | ---------------------- 主鍵為 (project_id, employee_id)。 employee_id 是員工表 Employee 表的外鍵。 員工…

leetcode1082. 銷售分析 I (SQL)

產品表&#xff1a;Product ----------------------- | Column Name | Type | ----------------------- | product_id | int | | product_name | varchar | | unit_price | int | ----------------------- product_id 是這個表的主鍵. 銷售表&#xff1a;Sale…

Oracle 獲取當前日期及日期格式

Oracle 獲取當前日期及日期格式 <wbr><wbr> 獲取系統日期&#xff1a;<wbr><wbr><span style"padding:0px; margin:0px; color:rgb(255,0,0)">SYSDATE()<br style"padding-bottom:0px; padding-top:0px; padding-left:0px; ma…

leetcode1083. 銷售分析 II(SQL)

Table: Product ----------------------- | Column Name | Type | ----------------------- | product_id | int | | product_name | varchar | | unit_price | int | ----------------------- product_id 是這張表的主鍵 Table: Sales --------------------…

leetcode1084. 銷售分析III(SQL)

Table: Product ----------------------- | Column Name | Type | ----------------------- | product_id | int | | product_name | varchar | | unit_price | int | ----------------------- product_id 是這個表的主鍵 Table: Sales --------------------…

炸窩(Java)拼接

數組中插入相關練習 例題&#xff1a;定義一個方法 &#xff0c;將數組{1,2,3}按照指定的格式進行拼接成一個字符串 /*例題&#xff1a;定義一個方法 &#xff0c;將數組{1,2,3}按照指定的格式進行拼接成一個字符串&#xff0c; 格式定義如下[word1#word2#word3]. 思路分析&a…

leetcode71. 簡化路徑 Unix 風格

以 Unix 風格給出一個文件的絕對路徑&#xff0c;你需要簡化它。或者換句話說&#xff0c;將其轉換為規范路徑。 在 Unix 風格的文件系統中&#xff0c;一個點&#xff08;.&#xff09;表示當前目錄本身&#xff1b;此外&#xff0c;兩個點 &#xff08;..&#xff09; 表示將…

李牛(Linux)腳本

Linux課堂筆記day01 主要總結內容&#xff1a; 一&#xff1a;Linux背景介紹 二&#xff1a;系統操作 三&#xff1a;服務管理 四&#xff1a;shell腳本 五&#xff1a;文本操作 六:常用服務搭建 01&#xff1a;初識linux 收獲&#xff1a;可以熟練應對運維和開發 對以后的生…

leetcode601. 體育館的人流量(SQL)

X 市建了一個新的體育館&#xff0c;每日人流量信息被記錄在這三列信息中&#xff1a;序號 (id)、日期 (visit_date)、 人流量 (people)。 請編寫一個查詢語句&#xff0c;找出人流量的高峰期。高峰期時&#xff0c;至少連續三行記錄中的人流量不少于100。 例如&#xff0c;表…