盡量避免在大多數代碼中使用指標實作,
使用現代C ++,您幾乎不需要傳遞指標,可以依賴參考,并且編譯器本身可以進行優化以避免不必要的復制和自動轉移所有權,但不總是,
智能指標的用例仍然存在,如果必須動態創建物件并將其回傳到呼叫堆疊,則希望它們在超出范圍時釋放自己,如果找不到確定的位置來洗掉物件,或者無法確定要洗掉該物件的物件,那么智能指標是一個很好的解決方案,
unique_ptr的一些優點是:
您知道您的smart_ptr將持續存在,直到不再位于任何范圍內,并且沒有函式或類會意外地將其銷毀,
整個代碼路徑中指向的物件將只有一個銷毀,
unique_ptr并不是一個真正的指標,它的行為就像一個透明的指標,將呼叫轉發到它所連接的物件,它不能“懸掛”并且不能為空,
unique_ptr的開銷幾乎與原始指標相同,即幾乎沒有,沒有使用原始指標的加速,
shared_ptr用于由多個執行緒,物件等共享(更震驚!)的資源,它們在時間和記憶體上的使用比unique_ptr昂貴,但是它們解決了在使用物件的函式結束時保持活動物件的難題,他們為我們提供了一個參考計數器和原子訪問,在垃圾回收語言中,參考計數由運行時執行緒保留,但C ++ shared_ptr保留其參考計數,在大多數程式中,shared_ptr的用例少于unique_ptr,
如何避免使用智能指標泄漏:
通常,他們為您完成作業,但有幾件事:
1.創建物件后,立即將其分配給指標,
Object * myobject = new Object(“ pi”,3.14159);
unique_ptr op(myobject);
std :: cout << op-> getname()<< std:endl;
2. 僅使用smart_pointer,不要再使用原始指標,
std :: cout << myobject-> getname()<< std:endl; //壞
//永遠不要在原始指標上呼叫delete,
3.僅在unique_ptr內部訪問該物件以復制該物件,
您不能復制unique_ptr,如果需要復制物件,
則應使用unique_ptr :: get()和new一起將副本分配
給另一個unique_ptr,
unique_ptr o2(* op); //簡短,但錯誤,
unique_ptr o2(new Object(* op)); // 對
4.將unique_ptrs作為unique_ptrs傳遞給函式,或者取消參考它們并將它們作為const參考傳遞,
5.如果函式必須擁有unique_ptr的所有權,則將其移入函式,
6. shared_ptr可以使用賦值()復制,a = b但不要將a重新分配給另一個shared_ptr,否則參考計數將減少,如果達到0,它將自行洗掉,
7.不要嘗試從靜態分配的物件中創建unique_ptr或shared_ptr,編譯器可能會讓您在編譯時無法使用它,但是當靜態分配的物件自行銷毀并且智能指標隨后嘗試洗掉它時,它將導致記憶體錯誤,僅用于動態分配的物件!
8.不要new與,(C ++ 14)一起使用std::make_unique,它代替new來進行記憶體分配,
希望對你有幫助!
另外如果你想更好的提升你的編程能力,學好C語言C++編程!彎道超車,快人一步!
C語言C++編程學習交流圈子,QQ群757874045【點擊進入】微信公眾號:C語言編程學習基地
分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
編程學習軟體分享:

編程學習視頻分享:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/70464.html
標籤:C++
