智慧型指標小結

2021-09-14 02:20:52 字數 2074 閱讀 2114

智慧型指標的存在是為了巧妙的解決程式設計過程中資源洩露的問題,利用了棧的特性,出棧之後物件會自動析構的特點來對資源進行有效的釋放。

主要存在的有兩大類智慧型指標,帶引用計數的智慧型指標和不帶引用技術的智慧型指標;

不帶引用的智慧型指標:

auto_ptr;

scoped_ptr;

unique_ptr;

以及帶引用計數的智慧型指標:

shared_ptr;

weak_ptr;

auto_ptr是一種簡單的智慧型指標,採用模板定義,在早期版本中會有乙個資源的標誌位,標誌這個資源的所有權,如果標誌位為0那麼這個指標其實是不能訪問指向的物件的;後來版本中做出了改進,取消了標誌位這個機制,它會對拷貝、賦值出來的智慧型指標採用release方法,對之前的舊指標直接置空,也就是說賦值、拷貝構造等操作完成之後,那麼之前的指標也就再不能使用了。

另外它還提供了兩個方法:

_ty *get() const();

get()方法會返回這個智慧型指標的值。

void reset(_ty *_ptr = 0);

reset方法會對之前所指向的物件進行析構,然後會讓智慧型指標再指向現在傳入的指標所指向的物件。

它和auto_ptr很像,對於它來說,它直接私有化了拷貝構造和賦值,也不能用等於和不等運算子,同樣也提供了get,reset方法,它還有乙個swap方法。

void swap(scoped_ptr & b);

也就是可以對另乙個scoped_ptr進行指標的交換。

unique_ptr建立可以傳入兩個引數型別,乙個當然是指標型別,另外有乙個是刪除器的型別,也就是對於析構它可以進行「定製化」。它同樣也提供了get(),swap(),reset()方法,與上面兩個不同的是它還提供了get_deleter()的方法。不過它也沒有私有拷貝構造和賦值,它是呼叫了被賦值的指標的刪除器將之前的資源釋放。

deleter_reference get_deleter();

可以返回刪除器的函式物件。

這是強型別的智慧型指標,往往和弱型別指標合用。它會有乙個引用計數來標記這個資源現在被幾個指標引用,只有當引用計數歸零時候,資源才會被釋放。

同樣的,shared_ptr也支援刪除器的定製。不過它還提供了中括號過載,可以用訪問。

它對之前說到的方法都有實現,新增了use_count()方法,owner_before()方法,_internal_equiv()方法。

long use_count() const;

返回當前的引用計數。

templatebool owner_before( shared_ptrconst & rhs ) const;

templatebool owner_before( weak_ptrconst & rhs ) const;

返回對於指標owner-based order關係的比較值。這裡將指標分為兩種情況。一種是owner pointer,代表指標所指向的就是乙個記憶體中的完整的物件,該物件可以被多個智慧型指標指向其中的某一部分;另外一種就是stored pointer,代表指標所指向的物件型別就是指標的型別,該物件可能是某個完整物件的一部分。對於這些指標,如果存在多個指標指向同乙個完整物件的某一部分,則在銷毀該物件時,只對完整的物件執行一次析構即可,其餘的不需要進行相關析構操作了。當然owner pointer>stored pointer。

bool _internal_equiv( shared_ptr const & r ) const;

返回兩個強型別智慧型指標是否相等。

這就是弱型別的智慧型指標,對於指向物件並沒有訪問許可權,如果它要去訪問物件那麼必須呼叫lock()方法提公升為強型別的智慧型指標,它所提供的方法和強型別智慧型指標類似,增加了lock()方法和expired()方法。

shared_ptrlock() const;

提公升這個指標,返回乙個同型別的強型別指標。

bool expired() const

用來判斷智慧型指標的引用計數是否為0。

explicit——基本上智慧型指標都加入了explicit關鍵字,也就是說它的方法不能支援隱式轉換。請注意!

對於智慧型指標來講,內部實現了原子操作,使用時候無需擔心,直接使用就好。

資料參考:

C 智慧型指標用法小結

智慧型指標的出現,讓很多記憶體洩漏的隱患降低了不少,但是本人真的非常非常不推薦大面積鋪開使用智慧型指標這個東西,這個東西一是效能不如老老實實new delete,而且一旦沒用用好,反而適得其反。但是畢竟智慧型指標也是很多人在用,作為複習進行一下小結。已經完全可以淘汰的auto ptr就不說了,沒人會...

C 控制代碼類(智慧型指標)小結

控制代碼類作用主要有兩個 控制代碼類儲存和管理基類指標,指標既可以指向基類型別物件又可以指向派生型別物件。使用者通過控制代碼類訪問繼承層次的操作,使用者 可以獲得動態行為 同時能夠確保自動正確的銷毀動態分配的物件,防止記憶體洩露。c primer 15.7節中用購物籃的例子說明 了c 不能通過物件 ...

智慧型指標 強弱智慧型指標

在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...