C 智慧型指標學習筆記

2021-10-12 08:43:36 字數 1309 閱讀 7958

原文:

摘錄智慧型指標

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...