C 智慧型指標

2021-09-26 21:46:13 字數 2741 閱讀 9174

在普通指標使用時,需要記住分配的記憶體手動釋放,否則就會造成記憶體洩漏。

智慧型指標的用途是幫助程式設計師,管理記憶體資源的一種方式,不用手動的釋放資源。

智慧型指標是基於raii思想產生的一種控制記憶體程式資源的方式。

raii

raii(resource acquisition is initialization)是一種利用物件生命週期來控制程式資源的簡單技術。

智慧型指標的要求

智慧型指標需要考慮的問題

指標使用時的問題,乙份資源可能不只被乙個指標控制(管理權問題),這就可能導致指標,使用資源和清理資源時出現問題。這就要求智慧型指標需要處理指標的拷貝問題,即資源管理權的問題

auto_ptr

auto_ptr拷貝時的處理方式時,將資源的管理權交接,這樣會導致原有的指標被懸空,導致解引用異常。

這樣的處理顯然不能讓人滿意,所以auto_ptr並不廣泛實用。

auto_ptr的模擬實現:

template

<

class

t>

//auto_ptr 拷貝思想:管理權轉移,一旦發生拷貝構造,將資源管理權轉移為拷貝的物件

class

autoptr

~autoptr()

autoptr

(autoptr

& ap)

:_ptr

(ap._ptr)

autoptr

&operator

=(autoptr

& ap)

return

*this;}

t&operator*(

) t*

operator

->()

private

: t* _ptr;

};

unique_ptr

unique_ptr解決拷貝問題就顯得簡單粗暴,直接不允許拷貝,也就避免了拷貝會出現問題。

這樣的處理方式,保證了指標使用的安全。

unique_ptr支援自定義deleter,即自定義析構函式。

#include

#include

using

namespace std;

struct my_deleter};

intmain()

unique_ptr的簡單模擬實現:

template

<

class

t>

//uniqueptr 思想:防拷貝

class

uniqueptr

//不允許拷貝 c++11

uniqueptr

(uniqueptr

& uq)

=delete

; uniqueptr

&operator

=(uniqueptr

& uq)

=delete;~

uniqueptr()

t&operator*(

) t*

operator

->()

private

: t* _ptr;

};

shared_ptr

shared_pt使用引用計數支援智慧型指標拷貝。

引用計數:

引用計數會出現執行緒安全問題,這個問題可以通過加鎖解決,這裡不再多加實現。

shared_ptr模擬實現:

template

<

class

t>

//sharedptr 思想: 引用計數支援智慧型指標拷貝

class

sharedptr

sharedptr

(sharedptr

& sp)

:_ptr

(sp._ptr)

,_link_num

(sp._link_num)

,_pmutex

(sp._pmutex)

~sharedptr()

_pmutex-

>

unlock()

;if(deleteflag ==

true)}

sharedptr

&operator

=(sharedptr

& sp)

_ptr = sp._ptr;

_link_num = sp._link_num;

_pmutex = sp._pmutex;

_pmutex-

>

lock()

;++(*_link_num)

; _pmutex-

>

unlock()

;}return

*this;}

t&operator*(

) t*

operator

->()

private

: t* _ptr;

int*_link_num;

mutex* _pmutex;

};

raii的思想不僅用於智慧型指標,還用於實現守衛鎖解決死鎖問題。

c 智慧型指標

auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...

c 智慧型指標

很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...

c 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...