智慧型指標利用了raii思想,利用智慧型指標物件的生命週期控制資源的分配和釋放,資源包括堆記憶體,開啟的檔案,socket等。
其中shared_ptr使用引用計數的方式,允許多個shared_ptr物件引用資源,每有乙個物件引用資源引用計數加一,當引用計數為0時,釋放管理的資源。
unique_ptr只允許乙個unique_ptr物件引用資源,支支援移動語義,不支援拷貝語義,移動語義下轉移資源所有權,使用reset(release())方法。
但是shared_ptr存在迴圈引用問題。如雙向鍊錶的節點,有前驅和後繼成員,都是shared_ptr,相鄰節點互相引用,造成節點的引用計數最少是2,所引用的資源無法釋放而產生洩露。
struct node};
/*or
class b;
class a;
class b;
也可以造成迴圈引用
*/int
main()
weak_ptr作為shared_ptr的補充,無法直接引用資源,必須靠shared_ptr初始化,不影響引用計數值,不負責資源的釋放。所以在資源類中將其中乙個成員的型別換成weak_ptr就能打破引用環(不用都換)。
struct node};
/*or
class b;
class a;
class b;
*/
提供share_ptrp = w.lock();
方法,當引用計數為0時返回的shared是nullptr,否則指向資源,從而通過shared完成對資源的釋放。
weak_ptr<
int>
w(p);if
(w.use_count()
!=0)//不對
if(shared_ptr<
int> q = w.
lock()
)//對
shared_ptr初始化兩種方式:
傳指標
int
* a =
newint(1
);shared_ptr<
int>
p(a),q
(a);
//這時兩個智慧型指標物件p,q裡的計數無法同步,都是1.
//避免這種
//盡量使用
shared_ptr<
int>p(
newint(1
));
make_shared
shared_ptr<
int> p = make_shared<
int>(1
);
template
<
typename t>
class
shared_ptr
}public
:shared_ptr()
:data_ptr
(nullptr),
count_ptr
(new
size_t(0
))explicit
shared_ptr
(t* p)
:data_ptr
(p),
count_ptr
(new
size_t(1
))shared_ptr
(const shared_ptr& other)
:data_ptr
(other.data_ptr)
,count_ptr(&
(++*other.count_ptr))~
shared_ptr()
shared_ptr&
operator=(
const shared_ptr& other)
void
swap
(const shared_ptr& other)
void
reset
(t* p)
t*release()
};
template
<
typename t>
class
shared_ptr
}public
:shared_ptr()
:data_ptr
(nullptr),
count_ptr
(new
size_t(0
)),del
(nullptr
)explicit
shared_ptr
(t* p, delfuncptr d =
nullptr):
data_ptr
(p),
count_ptr
(new
size_t(1
)),del
(d)shared_ptr
(const shared_ptr& other)
:data_ptr
(other.data_ptr)
,count_ptr(&
(++*other.count_ptr)),
del(other.del)
~shared_ptr()
shared_ptr&
operator=(
const shared_ptr& other)
void
swap
(shared_ptr& other)
void
reset
(t* p, delfuncptr d=
nullptr
) t*
release()
};
智慧型指標 auto ptr與shared ptr
auto ptr auto ptr是當年c 標準庫中提供的一種智慧型指標。auto ptr在構造時獲取某個物件的所有權,在析構時釋放該物件。可以提高 的安全性。例如 int p new int 0 auto ptrap p auto ptr主要是解決被異常丟擲時發生資源洩露問題。注意 1 auto ...
boost的指標智慧型指標(shared ptr)
boost智慧型指標常用的函式 get 獲取原始指標 bool unique 檢測是否唯一 long use count 引用計數 void swap 交換指標 reset 將引用計數減1,停止對指標的共享,除非引用計數為0,否則不會發生刪除操作。shared ptrspi new int 乙個in...
c 智慧型指標
auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...