视频加载失败

Rust学习——所有权、引用和借用

697 字
3 分钟
Rust学习——所有权、引用和借用
  1. 1Rust学习——所有权、引用和借用本文

所有权#

所有权所要解决的,是栈上的变量持有堆上的资源所带来的一系列问题(如悬垂引用、二次释放等)。

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;

xy持有的资源全部在栈上,因此没有发生所有权的转移,而是将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返回的字符串资源的所有权。

引用和借用#

获取变量引用的行为,就叫做借用
引用允许我们使用值,但是不获取所有权,自然也不会发生所有权的转移

不可变引用和可变引用#

不可变引用相当于对资源只读,而可变引用让你对资源除了可读还可写。
因此,同一作用域内,有以下规则:

  1. 不可变引用&T数量不限制
  2. 可变引用&mut T只能有1个
  3. 可变引用和不可变引用不能同时存在
  1. 很多个读者共存不会影响彼此
  2. 很多个写者共存会导致数据竞争
  3. 写者修改资源会影响读者

所有权和引用的联系#

围绕一个资源的所有操作无非是读和写。
持有某个资源所有权的变量当然可以对资源读和写。
但有时候将资源的所有权倒腾来倒腾去非常麻烦,这时候引用给我们提供了一个轻量化的选择——不可变引用负责,可变引用负责

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Rust学习——所有权、引用和借用
https://blog-zeta-seven-36.vercel.app/posts/rust-learn-ownership-1/
作者
机巧叶片
发布于
2026-09-10
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
机巧叶片
给互联网留下一点微小的贡献
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
最新动态
站点统计
文章
14
分类
3
标签
20
总字数
16,941
运行时长
0
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录