C 智慧型指標(一) auto ptr指標

2021-10-08 07:01:54 字數 2457 閱讀 5038

智慧型指標分為四種:

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中引入了智慧型指標的概念,方便管理堆記憶體。棧 堆區別 棧 系統開闢 系統釋放 堆 手動開闢 手動釋放 設計 ...