智慧型指標總結

2022-07-30 07:45:15 字數 2024 閱讀 8703

分類: 通用程式設計技術

2010-02-27 15:46

131人閱讀

收藏 舉報

c++中沒有垃圾**,所有的記憶體都要自己管理,也就是說new 與 delete必須由程式設計師自己去一一對應起來。這個難免會出現這樣那樣的記憶體問題。在這種背景下,智慧型指標應運而生。

智慧型指標的最終的目的是將一塊記憶體交給乙個託管物件,記憶體何時釋放由託管物件來決定,而對物件的訪問也使用託管物件來實現。這樣子物件new完後就不需要顯示的delete了,在它的生命週期結束後(也就是沒有託管物件引用它的情況下)就可以自動被釋放掉了。

智慧型指標有些比較簡單,如 std::auto_ptr , boost::scope_ptr等等,它們的功能都比較類似,就是在某乙個區域內指向乙個new出來的物件,當這個指標的生命週期結束後,在析構函式中呼叫delete函式釋放這塊記憶體,這類智慧型指標充其量就是少寫了乙個delete而已,由於它不能被傳遞到該指標生命週期外的其它的地方使用,故沒什麼太大的用處。

稍微複雜一些的智慧型指標都是維護是引用記數器的智慧型指標,這種指標可以任意傳遞,用法基本上和原生指標類似,所以使用的比較多一些。

帶引用記數的智慧型指標原理上基本類似,就是new了某乙個資源的時候,給該資源加上乙個計數器,每當有新的智慧型指標指向這個資源的時候,計數器就加1,當某個指向該資源智慧型指標超出生命週期或由於其它原因解除了和該資源的引用關係時,計數器減1,當計數器減到0 的時候,表示該資源已經沒有指標引用,就可以被釋放了。

根據記數器所處的位置不同,基本引用記數器的智慧型指標又分為兩類,一類是計數器處於資源中,一類是記數器處於智慧型指標中。

引用計數器處於資源中的智慧型指標管理的資源必須從某乙個基類繼承下來,在這個基類中提供了addref 與 release方法來管理引用計數。這樣子智慧型指標通過呼叫資源物件的addref 與 release 方法來實現資源的計數管理。很多類庫或系統的框架都會讓所有的物件從乙個基類中繼承,而引用計數功能就可以放在這個基類中實現。這種智慧型指標是專用的,也就是說它不能管理不從這個基類繼承的物件。

另外一種方法是將引用記數器放在智慧型指標本身中,這樣子智慧型指標就可以管理任意new出來的物件的生命週期,而不會物件本身作任何限制。這類智慧型指標的基本原理是每當乙個智慧型指標被乙個原生指標初始化的時候,就new出來乙個引用記數器。當指標被傳遞的時候,這個引用記數器中的值被修改,而引用記數器本身的位址也被傳遞給其它的智慧型指標,這種技術的關鍵在於,智慧型指標中儲存的不同引用計數器本身,而是引用計數器的乙個位址,這樣就可以實現同乙個資源的多個智慧型指標的傳遞過程中能保證引用記數的正確。最後,智慧型指標引用的物件的釋放與引用記數器本身的釋放是同步的,即乙個資源的引用物件為0的時候,它就可以被刪除了,同時,這個引用物件也可以被刪除了,因為乙個引用物件就是繫結到乙個特寫資源的,引用物件本身不對重用。這種型別的智慧型指標代表是boost::share_ptr。

基於引用計數的智慧型指標一般都會存在循引用的問題,關於迴圈引用這裡興個例子(**是網上拷的,見諒)

#include

#include

#include

#include

class parent;

class children;

typedef boost::shared_ptrparent_ptr;

typedef boost::shared_ptrchildren_ptr;

class parent

public:

children_ptr children;

};class children

public:

parent_ptr parent;

};void test()

void main()

執行該程式可以看到,即使退出了test函式後,由於parent和children物件互相引用,它們的引用計數都是1,不能自動釋放,並且此時這兩個物件再無法訪問到。這就引起了c++中那臭名昭著的記憶體洩漏。

為了解決這種情況,就出現了另乙個概念,叫弱引用,弱引用指標從乙個強引用指標產生,弱引用不增加被引用物件的引用計數,並提供了相應的函式來判斷當前引用的物件是否已經過期被釋放。如boost::weak_ptr為是乙個指向boost::share_ptr的弱引用。

智慧型指標總結

1.智慧型指標的原理 1 智慧型指標不是通常意義下的指標,而是乙個模板類,在對模板類例項化之後會產生類似於指標的行為。通過物件來管理資源。2 智慧型指標採用一種raii 資源分配即初始化 機制,在建構函式中實現對資源的分配及初始化,在析構函式中實現對資源的析構及 2.智慧型指標的分類 c 中最開始是...

智慧型指標總結

std shared ptr include class test public std enable shared from this void print intid int main std enable shared from this是乙個模板類,其中有乙個成員函式 shared ptrs...

智慧型指標總結

unique ptr weak ptr 智慧型指標與常規指標的區別 智慧型指標的選擇 智慧型指標並非c 11的原創,boost庫很早就提供了share ptr和weak ptr,c 11在此基礎上增加了unique ptr,從而形成了我們現在所說的智慧型指標。智慧型指標主要用於管理動態記憶體,當智慧...