shared_ptr是一個最像指針的"智能指針",是
boost.smart_ptr庫中最有價值、最重要的組成部分,也是最有用的,Boost庫的許多組件--甚至還包括其他一些領(lǐng)域的智能指針都使用了
shared_ptr。抱歉,我實在想不出什么更恰當?shù)脑~匯來形容它在軟件開發(fā)中的重要性。再強調(diào)一遍,shared_ptr非常有價值、非常重要、非常
有用。
shared_ptr與scoped_ptr一樣包裝了new操作符在堆上分配的動態(tài)對象,但它實現(xiàn)的是引用計數(shù)型的智能指針
,可以被自由地拷貝和賦值,在任意的地方共享它,當沒有代碼使用(引用計數(shù)為0)它時才刪除被包裝的動態(tài)分配的對象。shared_ptr也可以安全地放到標準容器中,并彌補了auto_ptr因為轉(zhuǎn)移語義而不能把指針作為STL容器元素的缺陷。
在C++歷史上曾經(jīng)出現(xiàn)過無數(shù)的引用計數(shù)型智能指針實現(xiàn),但沒有一個比得上boost::shared_ptr,在過去、現(xiàn)在和將來,它都是最好的。
1. shared_ptr的線程安全性
shared_ptr 本身不是 100% 線程安全的。它的引用計數(shù)本身是安全且無鎖的,但對象的讀寫則不是,因為 shared_ptr
有兩個數(shù)據(jù)成員,讀寫操作不能原子化。根據(jù)文檔,shared_ptr
的線程安全級別和內(nèi)建類型、標準庫容器、string 一樣,即:
- 一個 shared_ptr 實體可被多個線程同時讀??;
- 兩個的 shared_ptr 實體可以被兩個線程同時寫入,“析構(gòu)”算寫操作;
- 如果要從多個線程讀寫同一個 shared_ptr 對象,那么需要加鎖。
2. shared_ptr用法
shared_ptr sp(new
int(10));
//一個指向整數(shù)的shared_ptr
assert(sp.unique());
//現(xiàn)在shared_ptr是指針的唯一持有者
shared_ptr sp2 =
sp;
//第二個shared_ptr,拷貝構(gòu)造函數(shù)
assert(sp == sp2 && sp.use_count()
== 2);
//兩個shared_ptr相等,指向同一個對象,引用計數(shù)為2
*sp2 = 100;
//使用解引用操作符修改被指對象
assert(*sp ==
100);
//另一個shared_ptr也同時被修改
sp.reset();
//停止shared_ptr的使用
assert(!sp);
//sp不再持有任何指針(空指針)
示例二:
class
shared
//一個擁有shared_ptr的類
{
private:
shared_ptr
p;
//shared_ptr成員變量
public:
shared(shared_ptr
p_):p(p_){}
//構(gòu)造函數(shù)初始化shared_ptr
void
print()
//輸出shared_ptr的引用計數(shù)和指向的值
{
cout << "count:"
<<
p.use_count()
<< "v ="
<<*p <<
endl;
}
};
void print_func(shared_ptr
p)
//使用shared_ptr作為函數(shù)參數(shù)
{
//同樣輸出shared_ptr的引用計數(shù)和指向的值
cout
<< "count:"
<<
p.use_count()
<< " v="
<<*p <<
endl; }
int main()
{
shared_ptr
p(new
int(100));