Skip to content

Rust 所有权

所有权(系统)是 Rust 最独特的功能,可以使得 Rust 无需垃圾回收就可以保障内存的安全。因此,理解 Rust 中的所有权如何工作是十分的重要的。所欲全的功能:借用,slice,以及 Rust 如何在内存中布局数据的。
所有运行的程序都必须管理其使用计算机内存的方式,一些语言中具有垃圾回收机制,在程序运行时不断地寻找不再使用的内存;还有一些语言程序员必须亲自分配和释放内存,例如 C 语言。Rust 则选择了第三种方式,通过所有权系统管理内存,编译器在编译的时候会根据一些列的规则进行检查。在运行的时候所有权系统的任何功能不会减慢程序。
了解了 Rust 的所有权系统的规则,我们就会很自然地写出安全高效的代码。

所有权规则:

  1. Rust 中的内一个值都有一个被称为其所有者的变量。
  2. 值有且只有一个所有者。
  3. 当所有者(变量)离开作用域,这个值将被丢弃。

String 类型

  • string.clone
  • String ptr,len, capacity
  • 为什么整数类型不需要 clone 呢?
    • 因为像整数类型在编译时一直大小的类型被整个存储在栈上,所以其拷贝其实际的值是最快的,也没有导致 x 失效。
rust
let x = 5;
let y = x;

println!("x = {}, y = {}", x, y);

引用和借用

&符号表示引用,它们允许你使用值但不获得其所有权。解引用*。我们将获取引用作为函数 参数称为借用(borrowing)。就像现实生活中一样,如果一个人拥有某样东西,你可以从他那里借来,当你使用完毕之后,你必须还回去。如果你需要尝试修改借用的变量?那么这个值必须是允许修改的可变引用。&mut s

限制允许可变性

rust
let mut s = String::from("hello");

let r1 = &mut s;
let r2 = &mut s;

println!("{}, {}", r1, r2);

这是一种受限制的方式允许,这种方式的好处是避免数据竞争,数据竞争类似于竞争条件,可以由三个行为造成:

  1. 两个或者更多的指针同时访问同一个数据。
  2. 至少有一个指针被用来写入数据。
  3. 没有同步数据访问的机制。

{}大括号可以创建新的作用域,这样允许拥有多个可变引用,但是不能同时引用。