shared_ptr:計數的智慧型指標
它是乙個包裝了new操作符在堆上分配的動態物件,但它實現的是引用計數型的智慧型指標 ,可以被自由地拷貝和賦值,在任意的地方共享它,當沒有**使用(引用計數為0)它時才刪除被包裝的動態分配的物件。shared_ptr也可以安全地放到標準容器中,並彌補了auto_ptr因為轉移語義而不能把指標作為stl容器元素的缺陷。
執行緒安全性:
shared_ptr 本身不是 100% 執行緒安全的。它的引用計數本身是安全且無鎖的,但物件的讀寫則不是,因為 shared_ptr 有兩個資料成員,讀寫操作不能原子化。根據文件,shared_ptr 的執行緒安全級別和內建型別、標準庫容器、string 一樣,即:
shared_ptr是執行緒安全的,這個意思並不是說你可以安全地在多個執行緒中同時操作同乙個shared_ptr變數,而是說你可以把乙個shared_ptr賦值給兩個變數,分別被兩個執行緒使用。雖然是兩個變數,但它們指向同乙個物件,擁有同乙個引用計數,這裡shared_ptr保證這個引用計數能夠正常工作,不會混亂,不會少加一,也不會少減一,僅此而以。
它不保證儲存它的變數可以併發訪問,這應該由它的使用者保證;它也不保證它儲存的物件可以併發訪問,這要由物件本身負責,它只保證一點,就是它的引用計數操作是原子操作。shared_ptr只是內部的引用計數是執行緒安全的.
shared_ptr缺點:
1.避免對shared_ptr所管理的物件的直接記憶體管理操作,以免造成該物件的重釋放
2.shared_ptr並不能對迴圈引用的物件記憶體自動管理(這點是其它各種引用計數管理記憶體方式的通病)。注:其實就是交叉引用
交叉引用概述和解決方法::weak_ptr解決shared_ptr環狀引用所引起的記憶體洩漏
3.不要構造乙個臨時的shared_ptr作為函式的引數。(拋棄臨時物件,讓所有的智慧型指標都有名字,就可以避免此類問題的發生)
使用注意事項:
void test()
有缺陷 //可能的過程是先new int,然後調g(),g()發生異常,shared_ptr沒有建立,int記憶體洩露
//正確的用法為:
void test()
shared ptr和動態陣列
std shared ptr智慧型指標是c 11乙個相當重要的特性,可以極大地將開發者從資源申請 釋放的繁重勞動中解放出來。然而直到c 17前std shared ptr都有乙個嚴重的限制,那就是它並不支援動態陣列 include std shared ptrsp1 new int 10 錯誤,c ...
weak ptr和shared ptr功能總結
結構分析 weak ptr和shared ptr都包含乙個 m refcount資料成員,追溯其定義,內部包含乙個 sp counted base lp m pi。shared ptr能夠實現其功能依賴於對於多個shared ptr只例項化乙個 sp counted base lp 當我們通過某一s...
shared ptr的使用和陷阱
make shared分配一塊int型別大小的記憶體,並值初始化為100 返回值是shared ptr型別,因此可以直接賦值給sp shared ptr sp make shared 100 錯誤!不會進行隱式轉換,型別不符合 shared ptr sp1 new int 100 正確,直接初始化呼...