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)多久送多久。