Rust学习——所有权、引用和借用
697 字
3 分钟
Rust学习——所有权、引用和借用
- 1Rust学习——所有权、引用和借用本文
- 2Rust学习——简单链表的实现

所有权
所有权所要解决的,是栈上的变量持有堆上的资源所带来的一系列问题(如悬垂引用、二次释放等)。
let s = String::from("abcde");在这个例子里,栈上的s拥有堆上的“abcde”的所有权。
所有权的转移
在Cpp中,以下代码实现了字符串的赋值操作。
String s1 = "abcde";String s2 = s1;在这个代码里,s2相当于复制了s1字符串的字符内容,即完成了一次深拷贝。但在rust中:
let s1 = String::from("abcde");let s2 = s1;此时不同于cpp,它将s1对堆上”abcde”资源的所有权转移给了s2。此时s1不再有效,即s1不再持有任何资源。换句话来说,Rust永远也不会自动创建资源的“深拷贝”。
另外一个例子:
let x = 1;let y = x;x和y持有的资源全部在栈上,因此没有发生所有权的转移,而是将x的值复制给了y(它们实际上了实现了Copy的特征,因而可以直接复制而不是转移所有权)。
值得注意的是,不可变引用&T也是可以直接Copy的,但&mut T不行(&T的持有者对资源只读,因此非常安全)
函数传值与返回
函数传值和返回的过程也会伴随所有权的转移。
fn takes_ownership(s:String){ printfln!("{}",s);}
fn main(){ let str = String::from("abcde"); takes_ownership(str);}takes_ownership函数取得了str原本持有的资源的所有权。
fn return_str() -> { String::from("abcde")}
fn main(){ let s = return_str();}s取得了return_str返回的字符串资源的所有权。
引用和借用
获取变量引用的行为,就叫做借用
引用允许我们使用值,但是不获取所有权,自然也不会发生所有权的转移
不可变引用和可变引用
不可变引用相当于对资源只读,而可变引用让你对资源除了可读还可写。
因此,同一作用域内,有以下规则:
- 不可变引用
&T数量不限制 - 可变引用
&mut T只能有1个 - 可变引用和不可变引用不能同时存在
- 很多个读者共存不会影响彼此
- 很多个写者共存会导致数据竞争
- 写者修改资源会影响读者
所有权和引用的联系
围绕一个资源的所有操作无非是读和写。
持有某个资源所有权的变量当然可以对资源读和写。
但有时候将资源的所有权倒腾来倒腾去非常麻烦,这时候引用给我们提供了一个轻量化的选择——不可变引用负责读,可变引用负责写。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
Rust学习——所有权、引用和借用
https://blog-zeta-seven-36.vercel.app/posts/rust-study/ownership/








