c 智慧型指標以及shared ptr實現

2021-10-01 13:35:07 字數 2979 閱讀 9834

智慧型指標利用了raii思想,利用智慧型指標物件的生命週期控制資源的分配和釋放,資源包括堆記憶體,開啟的檔案,socket等。

其中shared_ptr使用引用計數的方式,允許多個shared_ptr物件引用資源,每有乙個物件引用資源引用計數加一,當引用計數為0時,釋放管理的資源。

unique_ptr只允許乙個unique_ptr物件引用資源,支支援移動語義,不支援拷貝語義,移動語義下轉移資源所有權,使用reset(release())方法。

但是shared_ptr存在迴圈引用問題。如雙向鍊錶的節點,有前驅和後繼成員,都是shared_ptr,相鄰節點互相引用,造成節點的引用計數最少是2,所引用的資源無法釋放而產生洩露。

struct node};

/*or

class b;

class a;

class b;

也可以造成迴圈引用

*/int

main()

weak_ptr作為shared_ptr的補充,無法直接引用資源,必須靠shared_ptr初始化,不影響引用計數值,不負責資源的釋放。所以在資源類中將其中乙個成員的型別換成weak_ptr就能打破引用環(不用都換)。

struct node};

/*or

class b;

class a;

class b;

*/

提供share_ptrp = w.lock();方法,當引用計數為0時返回的shared是nullptr,否則指向資源,從而通過shared完成對資源的釋放。

weak_ptr<

int>

w(p);if

(w.use_count()

!=0)//不對

if(shared_ptr<

int> q = w.

lock()

)//對

shared_ptr初始化兩種方式:

傳指標

int

* a =

newint(1

);shared_ptr<

int>

p(a),q

(a);

//這時兩個智慧型指標物件p,q裡的計數無法同步,都是1.

//避免這種

//盡量使用

shared_ptr<

int>p(

newint(1

));

make_shared

shared_ptr<

int> p = make_shared<

int>(1

);

template

<

typename t>

class

shared_ptr

}public

:shared_ptr()

:data_ptr

(nullptr),

count_ptr

(new

size_t(0

))explicit

shared_ptr

(t* p)

:data_ptr

(p),

count_ptr

(new

size_t(1

))shared_ptr

(const shared_ptr& other)

:data_ptr

(other.data_ptr)

,count_ptr(&

(++*other.count_ptr))~

shared_ptr()

shared_ptr&

operator=(

const shared_ptr& other)

void

swap

(const shared_ptr& other)

void

reset

(t* p)

t*release()

};

template

<

typename t>

class

shared_ptr

}public

:shared_ptr()

:data_ptr

(nullptr),

count_ptr

(new

size_t(0

)),del

(nullptr

)explicit

shared_ptr

(t* p, delfuncptr d =

nullptr):

data_ptr

(p),

count_ptr

(new

size_t(1

)),del

(d)shared_ptr

(const shared_ptr& other)

:data_ptr

(other.data_ptr)

,count_ptr(&

(++*other.count_ptr)),

del(other.del)

~shared_ptr()

shared_ptr&

operator=(

const shared_ptr& other)

void

swap

(shared_ptr& other)

void

reset

(t* p, delfuncptr d=

nullptr

) t*

release()

};

智慧型指標 auto ptr與shared ptr

auto ptr auto ptr是當年c 標準庫中提供的一種智慧型指標。auto ptr在構造時獲取某個物件的所有權,在析構時釋放該物件。可以提高 的安全性。例如 int p new int 0 auto ptrap p auto ptr主要是解決被異常丟擲時發生資源洩露問題。注意 1 auto ...

boost的指標智慧型指標(shared ptr)

boost智慧型指標常用的函式 get 獲取原始指標 bool unique 檢測是否唯一 long use count 引用計數 void swap 交換指標 reset 將引用計數減1,停止對指標的共享,除非引用計數為0,否則不會發生刪除操作。shared ptrspi new int 乙個in...

c 智慧型指標

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