傳送門:
深入淺出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