所有权
Stack和Heap区别
- Stack 可以保存指向 Heap上存储的数据的指针,而 Heap 只保存没有指针的数据。
- Stack 保存不可变数据,而 Heap 保存可变数据。
- Stack 保存可复制的数据,而 Heap 保存不可复制的数据。
- Stack 保存与特定函数关联的数据,而 Heap 保存可能比函数存活更长的数据。
原则
- Box 的所有者来管理内存释放:Rust 会自动释放 Box 的堆(heap)内存。
- Box 内存释放原则:如果一个变量拥有一个 box,当 Rust 释放该变量的 frame 时,Rust 会释放该 box 的堆内存(heap)。
- 移动堆(heap)数据原则:如果变量 x 将堆(heap)数据的所有权移动给另一个变量 y,那么在移动后,x 不能再使用。
- Clone 可避免移动:避免数据移动的一种方法是使用 .clone() 方法进行克隆
引用
没有“所有权”的指针。
1
2
3
4
5
6
7
8
9
10
fn main() {
let m1 = String::from("hello");
let m2 = String::from("world"); // L1
greet(&m1, &m2); // L3
let s = format!("{} {}", m1, m2);
}
fn greet(g1: &String, g2: &String) {
println!("{}, {}", g1, g2); // L2
}

解引用指针以访问数据,解引用运算符:*
可变引用提供对数据“唯一的”且“非拥有的”访问
- 不可变引用(共享引用):只读的
- 可变引用(独占引用):在不移动数据的情况下,临时提供可变访问