智慧型指標分為四種:
1、auto_ptr(c++98)
2、unique_ptr(c++11)
3、shared_ptr(c++11)
4、weak_ptr(c++11)
本篇我們只講auto_ptr指標的實現
temlpate<
typename t>
class
auto_ptr
~auto_ptr()
t*operator
->()
t&operator*(
)private
: t* mptr;};
class
test};
intmain()
auto_ptr存在的問題對於智慧型指標的使用我們是這樣的
int
main()
對於上述兩行**:
auto_ptr<
int> ap1 =
newint
;auto_ptr<
int> ap2 = ap1;
它的設計是這樣的:
首先我們生成的是ap1這個物件,ap1這個物件中有乙個指標mptr,這個mptr指向了乙個堆記憶體。接下來通過拷貝構造生成了ap2這個物件。ap2中也有乙個指標是mptr。同樣ap2這個物件也指向了這個堆記憶體。如下圖所示:
但是當物件的生存週期到了之後,ap2進行銷毀,由系統調動析構函式,釋放指向的這個堆記憶體,如下圖所示:
但是由於ap1和ap2指向的是同乙個堆記憶體,所有ap1進行銷毀的時候還是會再釋放一遍。所帶來的問題是同乙個堆記憶體被所次釋放,程式崩潰。
那麼如何解決這個問題呢?
因為auto_ptr實現的是所有權唯一(乙個堆記憶體只允許乙個智慧型指標去管理它)
那麼atuo_ptr是怎麼做的呢?
它會**舊的智慧型指標的所有權,也就是ap2指向這個堆記憶體的時候,ap1就會變成舊的智慧型指標,同時會讓ap1指向為空。保證了這個堆記憶體只有乙個指標指向。也就是保證了這個智慧型指標所有權唯一的特點。如下圖所示:
**中是這樣處理的:主要是在拷貝建構函式中處理。
temlpate<
typename t>
class
auto_ptr
auto_ptr
(auto_ptr
& rhs)
auto_ptr
&operator
=(auto_ptr
& rhs)
return
*this;}
~auto_ptr()
t*operator
->()
t&operator*(
)private
: t*
release()
t* mptr;
};
但是atuo_ptr也是有缺點的:拷貝或者賦值過程中,導致舊智慧型指標提前失效。
那麼如何解決atuo_ptr指標失效的問題呢?
我們繼續給出下乙個指標
這個指標不屬於c++標準庫中的乙個指標。
這個指標保證了智慧型指標的所有權不唯一,釋放權唯一
template
<
typename t>
class
smartptr
smartptr
(smartptr
& rhs)
smartptr
&operator
=(smartptr
& rhs)
return
*this;}
~smartptr()
mptr =
null;}
t*operator*(
) t&
operator*(
)private
: t* mptr;
int flag;
//釋放權的標識。true代表flag對這個堆記憶體有釋放權,false代表flag對這個堆記憶體沒有釋放權。};
intmain()
帶標誌位的智慧型指標存在的問題:釋放權轉移也會導致智慧型指標失效,許可權轉移。
auto_ptr的幾點注意事項:
C 智慧型指標(一) auto ptr
其中shared ptr和scoped ptr的應用範圍更大一些。在單例中,shared ptr比較好用。用來託管自定義型別物件,讓在堆上建立的自定義物件可以自動釋放 通過寫乙個智慧型指標類,通過智慧型指標類來建立自定義類的物件。在棧上建立智慧型指標物件,這樣,智慧型指標物件被釋放的時候,就把利用智...
C 智慧型指標 auto ptr
智慧型指標 auto ptr vc版本 擁有權管理和轉移 當乙個智慧型指標給另乙個智慧型指標初始化的時候,兩個智慧型指標將會同時指向乙個空間,這樣在物件析構的時候,會導致一塊空間釋放多次的問題,所以乙個物件從始至終只能擁有乙個智慧型指標,這樣就保證不會乙個物件多次釋放的問題.我們讓指標給指標初始化的...
C 智慧型指標(auto ptr)
智慧型指標 在c 中使用堆記憶體是非常頻繁的操作,堆記憶體的申請和釋放都由程式設計師自己管理。使用普通指標,容易造成堆記憶體洩露,二次釋放等問題,使用智慧型指標能更好的管理堆記憶體。c 11中引入了智慧型指標的概念,方便管理堆記憶體。棧 堆區別 棧 系統開闢 系統釋放 堆 手動開闢 手動釋放 設計 ...