1,作用域概念
捕獲環境
2,所有權概念
Rust則是通過所有權和借用來保證內存安全。很多人不理解為啥說Rust是內存安全的,其實就是在默認情況下,你是寫不出內存不安全的代碼的。
Rust的所有權并不難理解,它有且只有如下三條規則:
(1)Rust中的每個值都有一個被稱為其所有者的變量(即:值的所有者是某個變量);
(2)值在任一時刻有且只有一個所有者;
(3)當所有者(變量)離開作用域,這個值將被銷毀。
這里對第三點做一些補充性的解釋,所有者離開作用域會導致值被銷毀,這個過程實際上是調用一個名為drop的函數來銷毀數據釋放內存。在前文解釋作用域規則時曾提到過,銷毀的數據特指堆棧中的數據,如果變量綁定的值是全局內存區內的數據,則數據不會被銷毀。例如:
fn main(){{let mut s = String::from("hello");} // 跳出作用域,棧中的變量s將被銷毀,其指向的堆// 中數據也被銷毀,但全局內存區的字符串字面量仍被保留
}
Rust中每個值都有一個所有者,但這個說法比較容易產生誤會。例如:
#![allow(unused)]
fn main() {
let s = String::from("hello");
}
多數人可能會誤以為變量s是堆中字符串數據hello的所有者,但實際上不是。String字符串的實際數據在堆中,但是String大小不確定,所以在棧中使用一個胖指針結構來表示這個String類型的數據,這個胖指針中的指針指向堆中的String實際數據。也就是說,變量s的值是那個胖指針,而不是堆中的實際數據。
因此,變量s是那個胖指針的所有者,而不是堆中實際數據的所有者。但是,由于胖指針是指向堆中數據的,多數時候為了簡化理解簡化描述方式,也經常會說s是那個堆中實際數據的所有者。但無論如何描述,需要理解所有者和值之間的真相。