1. 智慧型指標的原理
(1).智慧型指標不是通常意義下的指標,而是乙個模板類,在對模板類例項化之後會產生類似於指標的行為。通過物件來管理資源。
(2)智慧型指標採用一種raii(資源分配即初始化)機制,在建構函式中實現對資源的分配及初始化,在析構函式中實現對資源的析構及**。
2. 智慧型指標的分類
c++ 中最開始是沒有智慧型指標的,智慧型指標是在boost庫(可以認為是c++的備胎庫)中的。隨著c++的發展,在c++11中引進了shard_ptr,unique_ptr,weak_ptr。
shard_ptr的原理
(1)shard_ptr允許賦值和拷貝,底層採用了引用計數,解決了auto_ptr 的淺拷貝問題。允許多個指標指向同乙個物件。
(2)但是shard_ptr 也會產生一些問題:第一,引用計數可能會引起執行緒安全問題;第二,會產生迴圈引用的問題。
迴圈引用問題是由weak_ptr和shard_ptr搭配解決的,具體解決方法看
解決迴圈引用
unique_prt的原理
它是獨佔所指物件的。即不允許別的物件來管理當前物件所管理的資源,即不能呼叫拷貝建構函式和賦值運算子過載函式,是防拷貝的。
注:防拷貝的方法
將賦值運算子過載函式和拷貝建構函式只給宣告並私有的訪問許可權。
weak_ptr的原理
weak_ptr是一種弱型別,是不能單獨出現的,必須配合shard_ptr來使用,主要用來解決迴圈引用問題。
3. boost庫中的智慧型指標
auto_ptr
auto_ptr是乙個不安全的智慧型指標,這是因為它在進行賦值運算子過載函式的呼叫和拷貝建構函式時會形成淺拷貝,導致析構時出現問題。
auto_ptr的模擬實現及問題
shard_ptr
(1)boost庫中的shard_ptr和c++11中的一樣。shard_ptr允許賦值和拷貝,底層採用了引用計數,解決了auto_ptr 的淺拷貝問題。允許多個指標指向同乙個物件。
(2)但是shard_ptr 也會產生一些問題:第一,引用計數可能會引起執行緒安全問題;第二,會產生迴圈引用的問題。
scoped_ptr
它和c++ 11中的unique是類似的,都是獨佔的,防拷貝的。scoped-array是管理物件陣列的。
4. 為什麼不用普通指標代替弱型別指標
弱引用不會改變物件的引用計數,這意味著weak不會管理物件記憶體,在功能上類似於普通指標,但是weak會檢測到物件記憶體是否被釋放,防止非法訪問記憶體。
智慧型指標總結
std shared ptr include class test public std enable shared from this void print intid int main std enable shared from this是乙個模板類,其中有乙個成員函式 shared ptrs...
智慧型指標總結
unique ptr weak ptr 智慧型指標與常規指標的區別 智慧型指標的選擇 智慧型指標並非c 11的原創,boost庫很早就提供了share ptr和weak ptr,c 11在此基礎上增加了unique ptr,從而形成了我們現在所說的智慧型指標。智慧型指標主要用於管理動態記憶體,當智慧...
智慧型指標總結
分類 通用程式設計技術 2010 02 27 15 46 131人閱讀 收藏 舉報 c 中沒有垃圾 所有的記憶體都要自己管理,也就是說new 與 delete必須由程式設計師自己去一一對應起來。這個難免會出現這樣那樣的記憶體問題。在這種背景下,智慧型指標應運而生。智慧型指標的最終的目的是將一塊記憶體...