原文:
摘錄智慧型指標
auto_ptr, unique_ptr,shared_ptr, weak_ptr
智慧型指標的作用是管理乙個指標,因為存在一下的情況: 申請的空間再函式結束時忘記釋放,造成記憶體洩漏。使用智慧型指標可以很大程度上的避免這個問題,因為智慧型指標是乙個類,當超出了類的例項物件的作用域時,會自動呼叫物件的析構函式,析構函式會自動釋放資源。所以智慧型指標的作用原理就是再函式結束時自動釋放記憶體空間,不需要手動釋放記憶體空間。
auto_ptr
(c++ 98的方案,在c++11 中已經被拋棄) 採用所有權模式
auto_ptr p1 (
new string (
"i reigned lonely as a cloud."))
; auto_ptr p2;
p2 = p1;
//auto_ptr不會報錯.
此時不會報錯, p2 剝奪了 p1的所有權, 但是當程式執行時訪問p1將會報錯。所以auto_ptr的缺點時: 存在潛在的記憶體崩潰問題!
unique_ptr
unique_ptr 實現獨佔式擁有,嚴格擁有的概念,保證同一時間內只有乙個智慧型指標可以指向該物件。它能避免資源洩露(例如:以new建立物件後因為發生異常而忘記呼叫delete)
// 採用所有權模式
unique_ptr p3 (
new string (
"auto"))
;unique_ptr p4;
p4 = p3;
編譯器認為 p3 = p4 非法, 避免了p3 不再指向有效資料的問題。嘗試複製p3時會編譯器出錯。而auto_ptr能通過編譯器 ,故會再執行期埋下出錯的隱患。因此,unique_ptr 比 auto_ptr 更安全。
另外,unique_ptr 還有更聰明的地方:當程式試圖將乙個 unique_ptr 賦值給另乙個時,如果 原unique_ptr 是個臨時右值,編譯器允許這麼做;如果原 unique_ptr 將存在一段時間,編譯器將禁止這麼做,比如:
unique_ptr
pu1(
new string (
"hello world"))
; unique_ptr pu2;
pu2 = pu1;
// #1 不允許
unique_ptr pu3;
pu3 = unique_ptr
(new string (
"you"))
;// #2 允許
其中#1留下 C 學習筆記之智慧型指標
眾所周知,c 中最讓程式設計師頭疼的就是關於記憶體的問題,其中不外乎以下幾點 1.緩衝區溢位 2.野指標 3.重複釋放記憶體 4.不配對的new delete 5.記憶體洩露 其中大多數的問題都是對指標的不正確使用帶來的。為此c 標準庫中對原始指標做了一些封裝,比如auto ptr,使得指標更容易使...
C 學習筆記15 智慧型指標分析
智慧型指標的實現 include using namespace std template typename t class smartpointer 實現一片堆空間只能由乙個智慧型指標標識 smartpointer const smartpointer obj 也需要實現一片堆空間只能由乙個智慧型...
C 智慧型指標weak ptr的學習筆記
weak ptr 智慧型指標是為了解決shared ptr相互引用導致的死鎖問題,它不控制物件的生命週期,不會增加物件的引用次數,和shared ptr可以相互轉化,是一種弱應用。下面的 就陷入了死鎖,p1和p2相互引用導致計數一直為1,而物件得不到銷毀。借助weak ptr指標 include i...