真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

深度剖析智能指針-創(chuàng)新互聯(lián)

RALL:資源分配即初始化,定義一個(gè)類(lèi)來(lái)封裝資源的分配和釋放,在構(gòu)造函數(shù)中完成資源的分配和初始化,在析構(gòu)函數(shù)中完成資源的清理。

創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供鎮(zhèn)安企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都做網(wǎng)站、網(wǎng)站制作、H5場(chǎng)景定制、小程序制作等業(yè)務(wù)。10年已為鎮(zhèn)安眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

首先來(lái)看這樣一個(gè)例子:

深度剖析智能指針

此例子乍一看上去,new/delete匹配,并沒(méi)有什么錯(cuò)。但就因?yàn)閞eturn的存在,使得Test()函數(shù)提前結(jié)束,并沒(méi)有執(zhí)行delete p。這就使得內(nèi)存泄露。

內(nèi)存泄露的危害:使得可用內(nèi)存越來(lái)越少,下一次開(kāi)辟可能不夠,程序崩潰。

為解決此類(lèi)問(wèn)題,引入智能指針。

所謂的智能指針就是智能/自動(dòng)化的管理指針?biāo)赶虻膭?dòng)態(tài)資源的釋放。

智能指針的行為類(lèi)似于常規(guī)指針,重要的區(qū)別在于它負(fù)責(zé)自動(dòng)釋放所指向的對(duì)象。

智能指針也是模板,當(dāng)我們創(chuàng)建一個(gè)智能指針時(shí),需要提供指針可以指向的類(lèi)型。

智能指針有:auto_ptr,scoped_ptr,shared_ptr,scoped_array,shared_array

1.auto_prt的模擬實(shí)現(xiàn)(以前)

深度剖析智能指針

深度剖析智能指針

注:以前的auto_ptr看起來(lái)已經(jīng)實(shí)現(xiàn)的挺好的,多個(gè)指針指向同一塊內(nèi)存,并且釋放的時(shí)候也正確。

但是在實(shí)現(xiàn)的時(shí)候,會(huì)出現(xiàn)"野指針"。也就是所謂的"懸掛指針"。

深度剖析智能指針在析構(gòu)函數(shù)中,只是對(duì)擁有管理權(quán)者進(jìn)行了析構(gòu)。在delete內(nèi)存之后重置指針的方法只對(duì)這個(gè)指針有效,對(duì)其他任何指向(已釋放的)內(nèi)存的指針是沒(méi)有作用的。所以會(huì)出現(xiàn)"野指針"。

為解決"野指針"問(wèn)題,可以將管理權(quán)轉(zhuǎn)交后,將以前的指針賦為NULL。也就是auto_ptr的現(xiàn)代寫(xiě)法。

auto_ptr的現(xiàn)代寫(xiě)法:

深度剖析智能指針

深度剖析智能指針

注:雖然此方法解決了"野指針"的問(wèn)題,但是在拷貝構(gòu)造和賦值后,只有一個(gè)指針有效。其他的都已為NULL,但有時(shí)候會(huì)對(duì)NULL指針進(jìn)行引用,使得程序崩潰。

2.簡(jiǎn)單粗暴的scoped_ptr

scoped_ptr不允許拷貝構(gòu)造和賦值,在C++11標(biāo)準(zhǔn)中叫unique_ptr

深度剖析智能指針

注:為了防拷貝和賦值

(1)只將拷貝構(gòu)造和賦值函數(shù)聲明不定義

(2)將拷貝構(gòu)造和賦值函數(shù)聲明為private或protected,防止別人搞破壞

3.允許拷貝和賦值的shared_ptr

shared_ptr是通過(guò)一個(gè)引用計(jì)數(shù)來(lái)記錄該塊空間被共享了幾次,只有當(dāng)計(jì)數(shù)器為0時(shí)才被釋放。

深度剖析智能指針

深度剖析智能指針

4. 簡(jiǎn)單粗暴的scoped_array

scoped_array和scoped_ptr類(lèi)似,是為了防拷貝和賦值。但是scoped_array是對(duì)數(shù)組來(lái)說(shuō)的,因此在析構(gòu)時(shí)要特別注意,應(yīng)該使用delete[]來(lái)釋放內(nèi)存。

深度剖析智能指針

注:scoped_ptr是為了防拷貝和賦值。因此只將拷貝和賦值聲明而不定義,并且將拷貝和賦值聲明為private或者protected,防止他人搞破壞。

5.允許拷貝和賦值的shared_array

shared_array和shared_ptr類(lèi)似。也是使用了一個(gè)引用計(jì)數(shù)。但是shared_array是對(duì)數(shù)組來(lái)說(shuō)的。因此在析構(gòu)時(shí)應(yīng)使用delete[]。

深度剖析智能指針

深度剖析智能指針

6.現(xiàn)代版的shared_ptr看起來(lái)不錯(cuò),但是會(huì)出現(xiàn)以下幾個(gè)問(wèn)題

(1)循環(huán)引用

(2)定置刪除器

6.1循環(huán)引用

深度剖析智能指針

深度剖析智能指針

為了解決循環(huán)引用,應(yīng)該使用弱指針weak_ptr(防止引用計(jì)數(shù)的增加)

深度剖析智能指針

注:所謂的weak_ptr就是用來(lái)服務(wù)shared_ptr。將一個(gè)weak_ptr綁定一個(gè)shared_ptr上不會(huì)改變shared_ptr的引用計(jì)數(shù)。

6.2 定置刪除器

我們都只到shared_ptr只能釋放new開(kāi)辟出來(lái)的空間。而對(duì)于malloc開(kāi)辟出來(lái)的空間,以及fopen打開(kāi)的文件不能處理。為了能夠處理各種情況,引入定置刪除器。而定置刪除器的實(shí)現(xiàn)是通過(guò)operator()即重載()來(lái)實(shí)現(xiàn)的。

深度剖析智能指針

深度剖析智能指針

深度剖析智能指針

深度剖析智能指針

測(cè)試結(jié)果:

深度剖析智能指針

注:任何情況下都不要使用auto_ptr。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專(zhuān)業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。


網(wǎng)頁(yè)名稱(chēng):深度剖析智能指針-創(chuàng)新互聯(lián)
瀏覽地址:http://weahome.cn/article/doeigh.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部