儘可能避免在大多數代碼中使用指針實現。編程
使用現代C ++,您幾乎不須要傳遞指針,能夠依賴引用,而且編譯器自己能夠進行優化以免沒必要要的複製和自動轉移全部權。但不老是。微信
智能指針的用例仍然存在。若是必須動態建立對象並將其返回到調用堆棧,則但願它們在超出範圍時釋放本身。若是找不到肯定的位置來刪除對象,或者沒法肯定要刪除該對象的對象,那麼智能指針是一個很好的解決方案。函數
unique_ptr的一些優勢是:學習
您知道您的smart_ptr將持續存在,直到再也不位於任何範圍內,而且沒有函數或類會意外地將其銷燬。優化
整個代碼路徑中指向的對象將只有一個銷燬。線程
unique_ptr並非一個真正的指針,它的行爲就像一個透明的指針,將調用轉發到它所鏈接的對象。它不能「懸掛」而且不能爲空。3d
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語言編程學習基地
分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!
編程學習軟件分享:
編程學習視頻分享: