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是那个堆中实际数据的所有者。但无论如何描述,需要理解所有者和值之间的真相。