为什么需要智能指针
參考自https://www.cnblogs.com/round1/p/12906648.html
主要為了避免以下Bug:
內(nèi)存泄露? ?:對(duì)象無(wú)法被釋放,最常見的問(wèn)題。
野指針? ? ? ?: 指針指向未知。
重復(fù)釋放? ?:? ? 顧名思義。
?
?
(一)內(nèi)存泄露 :?
?1. 拋出異常,函數(shù)中途退出,釋放操作沒有執(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é)
- 上一篇: leetcode78 子集
- 下一篇: MYSQ产品