c++裡面的四個智慧型指標: auto_ptr, shared_ptr, weak_ptr, unique_ptr. 其中後三個是c++11支援,並且第乙個已經被11棄用。
為什麼要使用智慧型指標: 智慧型指標的作用是更安全的管理乙個指標,因為存在以下這種情況:申請的空間在函式結束時忘記釋放,造成記憶體洩漏。使用智慧型指標可以很大程度上的避免這個問題,因為智慧型指標就是乙個類,當超出了類的作用域是,類會自動呼叫析構函式,析構函式會自動釋放資源。所以智慧型指標的作用原理就是在函式結束時自動釋放記憶體空間,不需要手動釋放記憶體空間。
1. auto_ptr(c++98的方案,cpp11已經拋棄) 採用所有權模式。
auto_ptr< string> p1 (new string ("i reigned lonely as a cloud.」)); auto_ptrp2; p2 = p1; //auto_ptr不會報錯.此時不會報錯,p2剝奪了p1的所有權,但是當程式執行時訪問p1將會報錯。所以auto_ptr的缺點是:存在潛在的記憶體崩潰問題!
2. unique_ptr(替換auto_ptr) unique_ptr實現獨佔式擁有或嚴格擁有概念,保證同一時間內只有乙個智慧型指標可以指向該物件。它對於避免資源洩露(例如「以new建立物件後因為發生異常而忘記呼叫delete」)特別有用。 採用所有權模式,還是上面那個例子
unique_ptrp3 (new string (「auto」)); //#4 unique_ptrp4; //#5 p4 = p3;//此時會報錯!!編譯器認為p4=p3非法,避免了p3不再指向有效資料的問題。因此,unique_ptr比auto_ptr更安全。 另外unique_ptr還有更聰明的地方:當程式試圖將乙個unique_ptr賦值給另乙個時,如果源unique_ptr是個臨時右值,編譯器允許這麼做;如果源unique_ptr將存在一段時間,編譯器將禁止這麼做,比如:
unique_ptrpu1(new string (「hello world」)); unique_ptrpu2; pu2 = pu1; // #1 not allowed
unique_ptrpu3; pu3 = unique_ptr(new string ("you")); // #2 allowed其中#1留下懸掛的unique_ptr(pu1),這可能導致危害。而#2不會留下懸掛的unique_ptr,因為它呼叫unique_ptr的建構函式,該建構函式建立的臨時物件在其所有權讓給pu3後就會被銷毀。這種隨情況而已的行為表明,unique_ptr優於允許兩種賦值的auto_ptr。 注:如果確實想執行類似與#1的操作,要安全的重用這種指標,可給它賦新值。c++有乙個標準庫函式std::move(),讓你能夠將乙個unique_ptr賦給另乙個。例如:
unique_ptrps1, ps2; ps1 = demo("hello"); ps2 = move(ps1); ps1 = demo("alexia"); cout << *ps2 << *ps1 << endl;3. shared_ptr shared_ptr實現共享式擁有概念。多個智慧型指標可以指向相同物件,該物件和其相關資源會在「最後乙個引用被銷毀」時候釋放。從名字share就可以看出了資源可以被多個指標共享,它使用計數機制來表明資源被幾個指標共享。可以通過成員函式use_count()來檢視資源的所有者個數。除了可以通過new來構造,還可以通過傳入auto_ptr, unique_ptr,weak_ptr來構造。當我們呼叫release()時,當前指標會釋放資源所有權,計數減一。當計數等於0時,資源會被釋放。 shared_ptr是為了解決auto_ptr在物件所有權上的侷限性(auto_ptr是獨佔的),在使用引用計數的機制上提供了可以共享所有權的智慧型指標。 成員函式: use_count返回引用計數的個數 unique返回是否是獨佔所有權( use_count為1) swap交換兩個shared_ptr物件(即交換所擁有的物件) reset放棄內部物件的所有權或擁有物件的變更,會引起原有物件的引用計數的減少 get返回內部物件(指標),由於已經過載了()方法,因此和直接使用物件是一樣的.如shared_ptrsp(new int(1)); sp與sp.get()是等價的
4. weak_ptr weak_ptr是一種不控制物件生命週期的智慧型指標,它指向乙個shared_ptr管理的物件.進行該物件的記憶體管理的是那個強引用的shared_ptr. weak_ptr只是提供了對管理物件的乙個訪問手段。weak_ptr設計的目的是為配合shared_ptr而引入的一種智慧型指標來協助shared_ptr工作,它只可以從乙個shared_ptr或另乙個weak_ptr物件構造,它的構造和析構不會引起引用記數的增加或減少。weak_ptr是用來解決shared_ptr相互引用時的死鎖問題,如果說兩個shared_ptr相互引用,那麼這兩個指標的引用計數永遠不可能下降為0,資源永遠不會釋放。 它是對物件的一種弱引用,不會增加物件的引用計數,和shared_ptr之間可以相互轉化, shared_ptr可以直接賦值給它,它可以通過呼叫lock函式來獲得shared_ptr.
class b; class a };
class b };
void fun() };不敢相信,ai,牛客網都做的這麼好。class
solution
else
}//讓第乙個指標走到第k個結點
if(i<=k)
while
(first!=
null
)return second;}}
;
記第一次面試
暑假一來,就像所有的面試大軍一樣衝上廣州。廣州這座匆忙的城市不知有多少找不到工作的程式設計師正在找工作,我應該是這百萬大軍中的一員吧。今天主要記錄一下面試的經歷以及一些記得的面試題目。程式設計師都是善於總結的孩紙,總喜歡把東西記錄下來 或許是腦子不好使。我這次是人生的第一次面試,職位是遊戲開發 un...
記第一次面試經歷
面試的時候交流水平也是一種能力 鏗鏘有力,落落大方,切勿戰戰兢兢 arraylist 鍵值對形式儲存 底層是乙個雜湊表 陣列 鍊錶 紅黑樹 儲存的過程,原理 先計算key的 hashcode,發現陣列中有內容,我們就呼叫 equal 比較 解決方式 currenthashmap,collection...
記第一次前端面試
不折不扣的應屆生 不折不扣的一年經驗 不折不扣的菜鳥,就是我!記錄一下珍貴的面試機會,這次踩的坑說不定下次還要踩呢!讓我仔細回味一下這次看似並不專業的面試是如何難住了智慧型的我 面試官 請做一下自我介紹 一句閒話沒有,簡單粗暴 我 我是來自xx大學xx專業的應屆生。具體的技術問題彷彿只有這三個,其他...