C 智慧型指標個人理解和實現

2021-10-23 08:59:51 字數 2536 閱讀 1492

->熟悉c++智慧型指標

c++98最初引入的智慧型指標概念,最開始使用智慧型指標是為了解決記憶體洩漏問題,防止 程式設計師在物件資源試用完成後不釋放造成記憶體洩漏,最初只有一種智慧型指標叫做auto_ptr:auto_ptr物件通過初始化指向由new建立的動態記憶體,它是這塊記憶體的擁有者,一塊記憶體不能同時被分給兩個擁有者。當auto_ptr物件生命週期結束時,其析構函式會將auto_ptr物件擁有的動態記憶體自動釋放。即使發生異常,通過異常的棧展開過程也能將動態記憶體釋放,存在乙個問題:兩個指標之間允許拷貝操作,但是因為獨佔特性,當右值被拷貝之後,右值指標指向物件會被析構,再次訪問會出錯。

c++11引入了unique_ptr,shared_ptr,weak_ptr三種指標,

首先說unique_ptr他與auto_ptr類似:但是不支援賦值和拷貝操作,當指標超出作用域之後會自動釋放指向物件的記憶體空間,unique_ptr十分依賴右值操作和移動語義;

shared_ptr最常使用的智慧型指標:

shared_ptr實現共享式擁有概念。多個智慧型指標可以指向相同物件,該物件和其相關資源會在「最後乙個引用被銷毀」時候釋放。從名字share就可以看出了資源可以被多個指標共享,它使用計數機制來表明資源被幾個指標共享。可以通過成員函式use_count()來檢視資源的所有者個數。除了可以通過new來構造,還可以通過傳入auto_ptr, unique_ptr,weak_ptr來構造。當我們呼叫release()時,當前指標會釋放資源所有權,計數減一。當計數等於0時,資源會被釋放。

shared_ptr實現**:

#inlcude 

using

namespace std;

template

<

typename t>

class

smartptr};

template

<

typename t>

smartptr

::smartptr

(t *p)

catch(.

..)}

template

<

typename t>

smartptr::~

smartptr()

}template

<

typename t>

smartptr

::smartptr

(const smartptr

* org)

template

<

typename t>

smartptr smartptr

::operator=(

const smartptr

* rhs)

this

->ptr=rhs;

*ptr_count=

*(rhs.ptr_count)

;return

*this;}

template

<

typename t>

t smartptr

::operator*(

)template

<

typename t>

t* smartptr

::operator

->()

template

<

typename t>

t* smartptr

::operator+(

int i)

template

<

typename t>

int smartptr

::operator

-(smartptr

& t1,smartptr

& t2)

weak_ptr是shared_ptr最忠實的小弟:

weak_ptr 是一種不控制物件生命週期的智慧型指標, 它指向乙個 shared_ptr 管理的物件. 進行該物件的記憶體管理的是那個強引用的 shared_ptr. weak_ptr只是提供了對管理物件的乙個訪問手段。weak_ptr 設計的目的是為配合 shared_ptr 而引入的一種智慧型指標來協助 shared_ptr 工作, 它只可以從乙個 shared_ptr 或另乙個 weak_ptr 物件構造, 它的構造和析構不會引起引用記數的增加或減少。weak_ptr是用來解決shared_ptr相互引用時的死鎖問題,如果說兩個shared_ptr相互引用,那麼這兩個指標的引用計數永遠不可能下降為0,資源永遠不會釋放。它是對物件的一種弱引用,不會增加物件的引用計數,和shared_ptr之間可以相互轉化,shared_ptr可以直接賦值給它,它可以通過呼叫lock函式來獲得shared_ptr。

右值與左值

c++中所有的值都必然屬於左值、右值二者之一。左值是指表示式結束後依然存在的持久化物件,右值是指表示式結束時就不再存在的臨時物件。所有的具名變數或者物件都是左值,而右值不具名。很難得到左值和右值的真正定義,但是有乙個可以區分左值和右值的便捷方法:看能不能對表示式取位址,如果能,則為左值,否則為右值。

C 智慧型指標個人記錄

shared ptr允許多個指標指向同乙個物件,unique ptr則 獨佔 所指向的物件。標準庫還定義了一種名為weak ptr的伴隨類,它是一種弱引用,指向shared ptr所管理的物件,這三種智慧型指標都定義在memory標頭檔案中。不可以用shared ptr或者weak ptr指向乙個u...

C 智慧型指標實現

1 問題的提出 先看下面的例子 class ctext ctext private int m ptr int funtext 在函式funtext 中,類的兩個物件共用了new出來的指標ptr。當函式執行開始時,呼叫兩次建構函式 退出執行時,呼叫兩次析構函式,而在第一次呼叫時已經delete pt...

智慧型指標實現C

include using namespace std template class shared ptrelse shared ptr const shared ptr ptr shared ptr operator const shared ptr ptr if this ptr this pt...