在c++語言程式設計時,當類中有指標成員時,一般有兩種方式來管理指標成員:一是採用值型的方式管理,每個類物件都保留乙份指標指向的物件的拷貝;另一種更優雅的方式是使用
智慧型指標,從而實現指標指向的物件的共享。
智慧型指標(smart pointer)的一種通用實現技術是使用引用計數(reference count)。智慧型指標類將乙個計數器與類指向的物件相關聯,引用計數跟蹤該類有多少個物件共享同一指標。
每次建立類的新物件時,初始化指標並將引用計數置為1;當物件作為另一物件的副本而建立時,拷貝建構函式拷貝指標並增加與之相應的引用計數;對乙個物件進行賦值時,賦值操作符減少左運算元所指物件的引用計數(如果引用計數為減至0,則刪除物件),並增加右運算元所指物件的引用計數;呼叫析構函式時,析構函式減少引用計數(如果引用計數減至0,則刪除基礎物件)。
智慧型指標通常使用類模板來實現。模擬類指標的各種行為。但是,其最重要的作用是對類指標成員的管理,防止懸垂指標的出現。
template為了實現引用計數,我們定義乙個_counter類來記錄引用次數,把_counter類的所有成員設定為private,因為其他的型別並不需要訪問_counter,只有smartpointer對其進行操作就行了,smartpointer將設為其友元類。class
smartpointer
t& operator *()
t* operator ->()
private
: t *pt;
};
class在smartpointer類中,保留_counter的指標。_counter
~_counter(){}
intuse;
};
templateclass
smartpointer
smartpointer(smartpointer
&rhs)
~smartpointer()
} smartpointer
& operator=(smartpointerrhs)
this->pc->use--;
if(pc->use == 0this->pt =rhs.pt;)
this->pc =rhs.pc;
this->pc->use++;
coutreturn *this<
smartpointer::operator=() invoked use is:
"
;
}
private:
t *pt;
_counter*pc;
};例如:我們有乙個hasptr類,其類成員中有乙個為指標*p。
class如果如下呼叫:hasptr
~hasptr()
private
:
int *p;
intvalue;
};
hasptr *php = new hasptr(3我們現在有兩個智慧型指標物件,指向同乙個hasptr物件,其模型如下:);
smartpointer
psp(php);
smartpointer
npsp(psp);
_counter的use成員(引用計數)為2.
智慧型指標實現
namespace smart smart count 增加引用計數,並返回計數值.intaddref 減少引用計數,並返回計數值.intrelease private 計數變數.intuse count 智慧型指標.template class t class smart ptr 構造空指標.ex...
實現智慧型指標
資源的轉移不推薦使用。舊庫使用擁有者會導致野指標 實現 template class autoptr autoptr autoptr ap ptr ap.ptr autoptr operator autoptr ap return this autoptr t getptr const t getp...
智慧型指標的實現
pragma once includeusing namespace std 原理 資源的轉移 解決的問題 釋放指標 缺陷 如果乙個指標通過拷貝構造和賦值運算子過載將管理的空間交給其他指標,則原指標是沒有辦法訪問這塊空間了 if 0 templateclass autoptr autoptr aut...