一、auto_ptr模板
auto_ptr與shared_ptr、unique_ptr都定義了類似指針的對(duì)象,可以將new到的地址賦給這一對(duì)象,當(dāng)智能指針過(guò)期時(shí),析構(gòu)函數(shù)會(huì)調(diào)用delete函數(shù),對(duì)象將被銷毀,由此內(nèi)存可以自動(dòng)被釋放。
二、shared_ptr模板
先看代碼:
auto_ptr p1 (new string("hello world!");
auto_ptr p2;
p2 = p1;
在以上代碼中,p1與p2指向同一對(duì)象,常規(guī)指針在釋放內(nèi)存時(shí),系統(tǒng)會(huì)嘗試刪除同一對(duì)象兩次。在auto_ptr中,對(duì)象的所有權(quán)會(huì)歸于p2,p1將會(huì)變?yōu)橐爸羔?。shared_ptr則允許多個(gè)指針指向同一個(gè)對(duì)象,每多一個(gè)指針指向,計(jì)數(shù)器就會(huì)+1,同樣在釋放的時(shí)候,當(dāng)數(shù)值減為0的時(shí)候即最后一個(gè)指針過(guò)期的時(shí)候才會(huì)調(diào)用delete函數(shù)。
三、unique_ptr模板
同樣為了避免多個(gè)指針指向,unique_ptr嚴(yán)格了所有權(quán)的概念,即我的就我的,不允許他人指向(如代碼段二中,采用unique_ptr編輯將會(huì)報(bào)錯(cuò),而原代碼會(huì)編譯通過(guò)但可能造成崩潰)。
四、總結(jié)
需要多個(gè)指針指向一個(gè)對(duì)象時(shí)可使用shared_ptr,如指針數(shù)組。不需要多個(gè)指針指向一個(gè)對(duì)象可使用uniq_ptr,uniqu_ptr比auto_ptr更加安全(編譯報(bào)錯(cuò)遠(yuǎn)比程序崩潰好得多)。
if(failed(l_hr))
{
return l_hr;
}
//dosomething of itestcomptr
couninitialize();
}
初看這段代碼是沒(méi)有任何問(wèn)題的,但是運(yùn)行還是會(huì)崩潰.如果我們?cè)?
coinitialize(null);下行加上"{"與couninitialize();上行加上"}"就不會(huì)出錯(cuò)了.為什么呢?
原因在于原來(lái)的coinitialize所開(kāi)的套間在couninitialize();后已經(jīng)被關(guān)閉.
而智能指針的組件對(duì)象卻并沒(méi)有釋放,直到程序調(diào)用ccomptr<itestcomptr>;的析構(gòu)函數(shù)時(shí)才調(diào)用
itestcomptr的release方法,但是這時(shí)候,套間已經(jīng)不在了,所以導(dǎo)致了程序的崩潰.在組件
的生命周期很短的時(shí)候,智能指針的使用基本是無(wú)害的,并且有時(shí)是非常方便的.
所以在使用智能指針時(shí)有以下建議:
1. 當(dāng)對(duì)象的生命周期很長(zhǎng)要小心使用.
2. 當(dāng)對(duì)象的生命周期不確定時(shí)不要使用.
3. 千萬(wàn)不要使用全局的智能指針.
if(failed(l_hr)) { return l_hr; } //dosomething of itestcomptr couninitialize(); } 初看這段代碼是沒(méi)有任何問(wèn)題的,但是運(yùn)行還是會(huì)崩潰.如果我們?cè)?coinitialize(null);下行加上"{"與couninitialize();上行加上"}"就不會(huì)出錯(cuò)了.為什么呢? 原因在于原來(lái)的coinitialize所開(kāi)的套間在couninitialize();后已經(jīng)被關(guān)閉. 而智能指針的組件對(duì)象卻并沒(méi)有釋放,直到程序調(diào)用ccomptr的析構(gòu)函數(shù)時(shí)才調(diào)用 itestcomptr的release方法,但是這時(shí)候,套間已經(jīng)不在了,所以導(dǎo)致了程序的崩潰.在組件 的生命周期很短的時(shí)候,智能指針的使用基本是無(wú)害的,并且有時(shí)是非常方便的. 所以在使用智能指針時(shí)有以下建議: 1. 當(dāng)對(duì)象的生命周期很長(zhǎng)要小心使用. 2. 當(dāng)對(duì)象的生命周期不確定時(shí)不要使用. 3. 千萬(wàn)不要使用全局的智能指針.。
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請(qǐng)?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號(hào)-4 Copyright ? 2016 學(xué)習(xí)鳥(niǎo). 頁(yè)面生成時(shí)間:2.679秒