Rust所有权学习笔记
作者:smice分类:Rust
日期:2023-10-20 17:08:002023-10-20阅读:116

Rust所有权

Rust的所有权是Rust的核心功能之一,对绝大多数程序员来说都是一个新概念,包括我自己。
在很多编程语言中,如Java、Kotlin、Scala、R、C#、Dart等面对对象且有自己的垃圾回收机制(GC)的语言来说,一个变量只要没被GC回收那都是可以修改的。但这种操作就很容易出现变量错误引用或者其他长生命周期的对象持有该变量导致内存泄漏,或者是使用时发现该变量值不符合预期,被其他所修改,而Rust的所有权机制能在编译期就将这些错误抛出,避免上线后出现异常。

所有权规则

  1. 任何一个值都有一个所有者
  2. 任何一个值在同一时刻有且只有一个所有者
  3. 所有者在离开作用域后会被丢弃(编译器自动添加的drop)
  4. 所有权规则只发生在复合数据类型(堆内存上的数据)
一、移动

当一个复合数据类型给其他变量赋值后,该变量所有权移动至新变量,原变量失效。
Rust中的移动和其他语言中的浅拷贝类似,都是将内存地址赋值,但rust中会将原变量失效,保证同一时刻只有一个所有者。

二、引用

当我们只想获取变量数据而不需要所有权时,可以使用引用&

let x=String::from("hello rust");
let y=&x;

如上代码所示,y变量只引用x变量的值而不获取x的所有权,所有x变量仍然有效

三、可变引用

当我们借用别人的变量需要修改值,但用完后需要还回去,这时就需要可变引用&mut

let mut a=String::from("hello");
change(&mut a);
println!("{}",a);
fn change(value:&mut String){
value.push_str(" world!");
}

如上打印结果为hello world!,我们改变了a变量的值,但我们不改变a的所有权。

总结:同一时刻,要么多个不可变引用,要么一个可变引用,可变引用和不可变引用不能同时存在。

弹幕评论