日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

为什么需要智能指针

發(fā)布時(shí)間:2023/12/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么需要智能指针 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

主要為了避免以下Bug:

內(nèi)存泄露? ?:對(duì)象無(wú)法被釋放,最常見的問(wèn)題。
野指針? ? ? ?: 指針指向未知。
重復(fù)釋放? ?:? ? 顧名思義。

?


?

(一)內(nèi)存泄露 :?

?1. 拋出異常,函數(shù)中途退出,釋放操作沒有執(zhí)行

C * c = new C; throw; //拋出 delete c; //沒有執(zhí)行

2 . 忘記釋放

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

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

?

結(jié)果:內(nèi)存無(wú)法釋放,直到壓榨完程序的所以內(nèi)存。

?

(二)野指針 :

1. 未初始化

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

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

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

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

?

結(jié)果:未定義,不可預(yù)測(cè)的行為

?

(三)重復(fù)釋放 :

c2 = c;
delete c; delete c2;

??

結(jié)果:程序異常結(jié)束。

?


?

 智能指針

上一章提到,值語(yǔ)義對(duì)象作為局部變量,存儲(chǔ)在棧區(qū),生命周期由程序管理,因此值語(yǔ)義可以作為資源句柄。

這個(gè)技術(shù)叫做RALL,在資源句柄的構(gòu)造函數(shù)進(jìn)行資源初始化,在析構(gòu)函數(shù)進(jìn)行資源釋放


智能指針,就是值語(yǔ)義的資源句柄。將對(duì)象語(yǔ)義轉(zhuǎn)為值語(yǔ)義,至少?gòu)某橄蟮慕嵌瓤雌饋?lái)是這樣。

?

智能指針是解決了以上的問(wèn)題嗎?

1. 因?yàn)橹悄苤羔樖侵嫡Z(yǔ)義的,所以保證不發(fā)生內(nèi)存泄露和重復(fù)釋放。

2. 智能指針執(zhí)行默認(rèn)初始化和智能指針一定在對(duì)象銷毀之前銷毀,所以不可能出現(xiàn)野指針。

?

?

總結(jié)

以上是生活随笔為你收集整理的为什么需要智能指针的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。