【RUST】Ch15 智能指針(Smart Pointers)

指針,一般是指一個包含內存地址的變量。這個地址一般引用,或者說指向其餘數據。在Rust中,最多見的指針類型就是引用(reference),其已經在第4章中介紹。引用會被 & 符號所標明,同時從他們所指向的數據中借出值。跟引用指向的數據相比較,引用並無任何特殊能力。 同時,引用也沒有咱們一般所使用的指針所帶來的開銷。設計模式

在另外一方面,智能指針不單單是一種行爲看起來像指針的數據結構,也同時擁有額外的元數據和能力。智能指針的概念不單單隻存在於rust中,它起源於C++,也存在於其餘語言中。 在Rust中,標準庫中定義的不一樣的智能指針的能力超出了引用所提供的能力。咱們在本章中學習的‘引用計數’智能指針就是一個列子。這種指針經過保存擁有者的總數來使得你有多個數據擁有者,同時,當沒有擁有者時,則清楚數據.數據結構

在rust中,咱們使用了擁有者和借出的概念。引用和智能指針的一個額外區別是,引用僅僅是用來借數據的指針,相反的,在不少場景中,智能指針對他們指向的數據有擁有權學習

在本書中,咱們已經遇到過幾種智能指針來,好比第八章中的String和Vec<T>,雖然當時咱們尚未把它們叫作智能指針。這兩種其實都是智能指針,由於它們擁有本身的內存且容許你操做它們。它們也擁有一些元數據(好比容量),而且額外的能力或者約束(好比String確保了它的內容必定是合法的UTF-8)設計

智能指針通常都經過結構體來實現。與普通的結構體的區別是,智能指針實現了Deref和Drop特徵。Deref特徵使得一個智能指針的實列的行爲跟引用一致,這樣使得在引用上工做的代碼,移植到智能指針後依然適用。Drop特徵則容許你在智能指針的實列在界限外可以自定義一些行爲。在本章中,咱們會討論上述兩個特徵並展現爲何他們對智能指針如此重要。指針

Rust中,使用智能指針是一種常見的設計模式。本章中並不會覆蓋智能指針的每一個方面,有不少庫實現了本身的智能指針,固然你也能夠本身實現。本章會覆蓋標準庫中的大多數常見的智能指針:ip

  • Box<T> 用於在堆上分配值
  • Rc<T> 開啓多個ownership的引用計數類型
  • Ref<T>和RefMut<T>, 經過RefCell<T>訪問,一種在運行時而不是編譯時強制借出規則。

除此以外,咱們也會涉及到內部可變性模式,用於暴露一個改變內部值到API。咱們也會討論引用循環:引用循環如何致使內存泄露以及如何防止。內存

讓咱們開始吧。編譯

相關文章
相關標籤/搜索