深入淺出Rust(第二部分-1)


傳送門:
深入淺出Rust(第一部分-1)
深入淺出Rust(第一部分-2)
深入淺出Rust(第二部分-1)
深入淺出Rust(第二部分-2)
深入淺出Rust(第三部分-1)
深入淺出Rust(第三部分-2)
深入淺出Rust(第四部分)
深入淺出Rust(第五部分)


第二部分 - 內(nèi)存安全 -1

第10章 內(nèi)存安全基礎(chǔ)

1.堆與棧

書里的配圖看不清啊,換兩張:

10-1.png
10-2.png

2. 段錯誤

  • segfault: segmentation fault 的縮寫,內(nèi)存是分段的,如果代碼訪問到自己不該訪問的段.操作系統(tǒng)內(nèi)核就會直接結(jié)束經(jīng)常,也就是core-ump

3. 內(nèi)存安全

  • Rust需要避免的問題: 空指針,野指針,懸空指針,未初始化內(nèi)存,非法釋放,緩沖區(qū)溢出,執(zhí)行非法函數(shù)指針,數(shù)據(jù)競爭.

第11章 所有權(quán)和移動語義

1. 什么是所有權(quán)

2. 移動語義

  • Rust的賦值,默認是Move語義的.進行了所有權(quán)轉(zhuǎn)移,因此有利于編譯器進行靜態(tài)檢查.

3. 復(fù)制語義

  • 如果需要復(fù)制一個對象,需要調(diào)用clone,重新申請一片內(nèi)存.
  • 一些簡單類型,整數(shù)/bool的默認語義是"copy",使得編寫時候簡單一些.
  • [derive(Copy,Clone)]

4. Box類型

  • Box代表"擁有所有權(quán)的指針",它只有move語義,沒有copy語義.也就是說Box<T>會把T包裝為一個指針來訪問.

5. clone VS. Copy

  • 看總結(jié):
11-1.png
11-2.png

6. 析構(gòu)函數(shù)

  • impl std::pos:Drop 實現(xiàn)Drop Trait
  • 析構(gòu)函數(shù)調(diào)用時機,在變量的作用域結(jié)束(實際上是編譯器判斷的),析構(gòu)函數(shù)就被調(diào)用,由于局部變量保存在一個"棧"中,"先進后出"
  • RAII資源管理:
  • 手工析構(gòu): drop(v):,或者let _ = v
  • 析構(gòu)標(biāo)記: 編譯器自動對變量進行析構(gòu)標(biāo)記,如果已經(jīng)手工析構(gòu),就不再作用域結(jié)束進行自動析構(gòu)

第12章 借用和生命周期

1. 生命周期

2. 借用(&或&mut)

  • 借用相當(dāng)于C里面的取地址,但是借用指針只能讀,不能寫,如果要寫,還要配合mut

3.借用規(guī)則

12-1.png

4. 生命周期標(biāo)記(這個好難...)

  • 生命周期標(biāo)記應(yīng)用于函數(shù)參數(shù)和返回值,用來表示每個值得生命周期關(guān)系

5. 省略生命周期標(biāo)記(lifetime elision rules)

  • 每個帶生命周期參數(shù)的輸入,每個對應(yīng)不同的生命周期參數(shù)
  • 如果只有一個輸入?yún)?shù)帶生命周期參數(shù),那么返回值的生命周期被指定為這個參數(shù).
  • 如果有多個參數(shù)帶生命周期參數(shù),但其中有&self,&mut self,那么返回值得生命周期被指定為這個參數(shù)
  • 如果以上都不滿足,則不能自動補全返回值的生命周期參數(shù).

第13章 借用檢查

  • Rust: 共享不可變,可變不共享(共享類似讀鎖,可變類似讀鎖)

1. 編譯錯誤

2. 內(nèi)存不安全:枚舉修改

13-1.png

3. 內(nèi)存不安全:迭代器失效

  • 不允許迭代過程修改容器(增,刪)

4. 內(nèi)存不安全:懸空指針

  • 不允許借用后,原有容器發(fā)生變化(擴容)

第14章 NLL(Non-lexical-Lifetime)(沒有語義生命周期)

1. NLL希望解決的問

2. NLL原理

  • 讓借用的生命周期不過長,適而可止,在編譯器中利用MIR(Middle-level intermediate representation)分析.


    14-1.png

第15章 內(nèi)部可變性

這些類型,這章只是講解了理論,還是要配合真正用到的代碼看看才行.

1. Cell

  • 由Cell進行包裝,實現(xiàn)內(nèi)部數(shù)據(jù)只能由Cell訪問(單線程確實數(shù)據(jù)安全)
15-1.png

2. RefCell

  • 其返還值都是Ref類型的.
15-2.png

3. UnsafeCell

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容