前幾天看了下webkit裡的幾種常用的智慧型指標**,小結一下
refcounted:
提供引用計數器功能。使用時繼承之
class foo : public refcounted
為了更為方便安全地使用引用計數功能,webkit提供了refptr。
threadsafeshared
多執行緒版本的引用計數
refptr / passrefptr
儲存支援引用計數的指標(如refcount,threadsafeshared等子類, 又如stringimpl),防止cyclic references?
refptr 與 passrefptr 基本類似,區別在於作為引數進行傳遞時引用計數的變化。
refptr 作為引數對 refptr 和 passrefptr 進行賦值或構造,會對引數 refptr 的指標增加引用計數。
passrefptr 作為引數對 refptr 和 passrefptr 進行構造或賦值,會轉移指標擁有權,故引數 passrefptr 那個指標的引用計數不變。
當然,賦值操作會減少被賦值物件原先擁有的指標的引用計數。
用指標構造refptr和passrefptr會增加其引用計數。
passrefptr::leakref(): 交出擁有權
adoptref(): 構造passrefptr,僅獲得指標擁有權
refptr::release(): 擁有權轉移給passrefptr(返回值)
一般推薦使用 refptr, 但是在作為引數傳遞或作為返回值的時候,使用 passrefptr更為高效, 因為這兩種情況編譯器會生成臨時變數, 若用 refptr, 就會多一次引用計數的增減(臨時變數構造和銷毀)。
ownptr / passownptr
不採用引用計數方式,可以儲存一般的指標. 乙個指標只能被乙個 ownptr 或 passownptr 唯一擁有, 採用摧毀式拷貝策略, 類似std::auto_ptr
參考文獻
源**
WebKit中的智慧型指標
智慧型指標的實現原理 智慧型指示通常是通過引用計數器來自動維護物件的引用情況。引用計數跟蹤該類有多少個物件共享同一指標。每次通過adoptref 函式建立智慧型指標時將引用計數置為 1 當物件被另乙個智慧型指標引用時增加與之相應的引用計數 對智慧型指標進行賦值時,賦值操作符減少左運算元所指物件的引用...
智慧型指標類模板(中) Qt中的智慧型指標
qt中的智慧型指標 qpointer 當其指向的物件被銷毀時,它會被自動置空 析構時不會自動銷毀所指向的物件 qsharedpointer 引用計數型智慧型指標 可以被自由的拷貝和賦值 當引用計數為0時才刪除指向的物件 include include using namespace std clas...
智慧型指標類模板(中) Qt中的智慧型指標
qt中的智慧型指標 qpointer 當其指向的物件被銷毀時,它會被自動置空 析構時不會自動銷毀所指向的物件 qsharedpointer 引用計數型智慧型指標 可以被自由的拷貝和賦值 當引用計數為0時才刪除指向的物件 include include using namespace std clas...