Rust所有权机制

这篇具有很好参考价值的文章主要介绍了Rust所有权机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

所有权机制是Rust的核心功能之一,对于初学者算是一个重难点,它保证了程序无需GC,即可自动化的释放内存
希望这篇博客可以帮助你快速理解所有权机制

概念

Rust的值都只有一个变量是该值的所有者
所有者可以切换,但是值在任一时刻有且仅有一个所有者
当所有者离开作用域,该值将被丢弃

错误示例

在变量的作用域之外访问该变量

fn main() {
    {
        let s = String::from("hello"); // 创建字符串,该字符串的所有者是变量s
    } // 离开作用域,该字符串被丢弃
    println!("{}", s); // 编译报错,此时变量s已被释放,无法访问变量s
}

访问一个所有权被转移的变量

fn main() {
	let s = String::from("hello"); // 创建字符串,该字符串的所有者是变量s
    let a = s; // 字符串的所有权从变量s传递给变量a
	println!("{}",s); // 编译报错,此时字符串的所有权已被转移,无法在通过变量s访问字符串
}

访问一个所有权被转移的变量

fn main() {
	let s = String::from("hello"); // 创建字符串,该字符串的所有者是变量s
    takes_ownership(s); // 字符串的所有权从变量s传递给函数takes_ownership
	println!("{}",s); // 编译报错,此时字符串的所有权已被转移,无法在通过变量s访问字符串
}

fn takes_ownership(s: String) {
	println!("我拿到了字符串\"{}\"的所有权", s); // 拿到字符串的所有权
} // 离开作用域,该字符串被丢弃

借用

在上述错误示例中,我们不难发现,如果我们把String字符串的所有权传递给函数,那么等到函数结束,我们就无法在使用该字符串了,对于我们,这显然是无法接受的,那么几种解决方法解决这个问题,例如

fn main() {
    let mut s = String::from("hello");
    s = takes_ownership(s);
    println!("{}", s);
}

fn takes_ownership(s: String) -> String {
	println!("我拿到了字符串\"{}\"的所有权", s); // 拿到字符串的所有权
    s // 返回该字符串
}
fn main() {
    let mut s = String::from("hello");
    s = takes_ownership(s);
    println!("{}", s);
}

fn takes_ownership(s: String) -> String {
	println!("我拿到了字符串\"{}\"的所有权", s); // 拿到字符串的所有权
    s // 返回该字符串
}

但是上述做法并不优雅,Rust推荐的做法是我们通过借用来解决这个问题,借用就是创建一个引用的行为,例如

fn main() {
	let s = String::from("hello");
    takes_ownership(&s); // 将字符串的引用传递给函数
    println!("{}", s);
}

fn takes_ownership(s: &String) { // 借用到字符串的引用
	println!("我借用到了字符串\"{}\"的引用", s);
} // 此时字符串的所有权并没传递给函数,应此该函数没有资格释放该字符串

如果我们需要在函数内部修改字符串,那么我们可以借用字符串的可变引用

fn main() {
	let mut s = String::from("hello");
    takes_ownership(&mut s); // 将字符串的引用传递给函数
    println!("{}", s);
}

fn takes_ownership(s: &mut String) { // 借用到字符串的可变引用
	println!("我借用到了字符串\"{}\"的可变引用", s);
	s.push_str(" world"); // 修改该字符串
} // 此时字符串的所有权并没传递给函数,应此该函数没有资格释放该字符串

可变引用虽好,但是有个注意事项,就是同一时刻可变引用只能有一个,当存在可变引用的时候,就不能有不可变引用,但是当可变引用不存在的时候,就可以存在数个不可变引用,例如

fn main() {
	let mut s = String::from("hello");
    let (a, b) = (&s, &s); // 借用两个字符串的不可变引用
    println!("不可变借用a:{}, 不可变借用b:{}", a, b);
    let c = &mut s; // 借用字符串的可变引用,此时前面的两个不可变引用不再生效
    c.push_str(" world");
    println!("{}", c);
}

还有一个注意事项就是,引用的内容必须合法,例如下面的错误示范文章来源地址https://www.toymoban.com/news/detail-722584.html

fn main() {
    let s = dangle();
}

fn dangle() -> &String {
    let s = String::from("hello"); // 创建字符串,该字符串的所有者是变量s
    &s // 返回字符串的引用,但是此时字符串要已经离开作用域被释放了,因此当函数结束,这个引用将是一个非法的悬垂引用,不过还好,在rust中这种行为无法通过编译
}

引用规则总结

  1. 在任意时刻只能有一个可变引用,要么只能有多个不可变引用
  2. 引用必须有效

到了这里,关于Rust所有权机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Rust之所有权

    程序需要管理自己在运行时使用的计算机内部空间。Rust语言采用包含特定规则的所有权系统来管理内存,这套规则允许编译器在编译的过程中执行检查工作,而不会产生任何的运行时开销。 Rust中的每一个值都有一个对应的变量作为它的所有者; 在同一时间内,值有且仅有一

    2024年02月16日
    浏览(13)
  • 【Rust】所有权

    【Rust】所有权

    所有权是Rust最独特的特性,它让Rust无需GC(Garbage Collection)就可保证内存安全。Rust的核心特性就是所有权,所有程序在运行时都必须管理它们使用计算机内存的方式。有些语言有垃圾回收机制,在程序运行时会不断地寻找不再使用的内存。在其他语言中,程序员必须显式地

    2024年02月11日
    浏览(11)
  • 【Rust】Rust学习 第四章认识所有权

    【Rust】Rust学习 第四章认识所有权

    所有权(系统)是 Rust 最为与众不同的特性,它让 Rust 无需垃圾回收(garbage collector)即可保障内存安全。因此,理解 Rust 中所有权如何工作是十分重要的。 4.1 所有权 所有运行的程序都必须管理其使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时不断地

    2024年02月13日
    浏览(12)
  • Rust-所有权(ownership)

    Rust入门学习系列-Rust 的核心功能(之一)是 所有权(ownership)。引入这个概念是为了更好的管理计算机的内存。下面篇幅让我们来研究下这个功能有什么神奇之处。 常见的编程语言中计算机内存管理方式: Java:Java使用Java虚拟机(JVM)来管理计算机内存。JVM有一个垃圾回收

    2024年02月19日
    浏览(15)
  • Rust核心功能之一(所有权)

    Rust核心功能之一(所有权)

    目录 1、什么是所有权? 1.1 所有权规则  1.2 变量作用域 1.3 String 类型 1.4 内存与分配 变量与数据交互的方式(一):移动 变量与数据交互的方式(二):克隆 只在栈上的数据:拷贝 1.5 所有权与函数 1.6 返回值与作用域 所有权(系统)是 Rust 最为与众不同的特性,对语言的

    2024年02月04日
    浏览(17)
  • rust学习——栈、堆、所有权

    rust学习——栈、堆、所有权

    栈和堆是编程语言最核心的数据结构,但是在很多语言中,你并不需要深入了解栈与堆。 但对于 Rust 这样的系统编程语言,值是位于栈上还是堆上非常重要, 因为这会影响程序的行为和性能。 栈和堆的核心目标就是为程序在运行时提供可供使用的内存空间。 栈 栈按照顺序存

    2024年02月07日
    浏览(13)
  • Rust-所有权和移动语义

    Rust-所有权和移动语义

    拿C语言的代码来打个比方。我们可能会在堆上创建一个对象,然后使用一个指针来管理这个对象: 接下来,我们可能需要使用这个对象: 然而,这段代码之后,谁能猜得到,指针p指向的对象究竟发生了什么?它是否被修改过了?它还存在吗,是否已经被释放?是否有另外一个指

    2024年01月18日
    浏览(14)
  • 30天拿下Rust之所有权

    概述         在编程语言的世界中,Rust凭借其独特的所有权机制脱颖而出,为开发者提供了一种新颖而强大的工具来防止内存错误。这一特性不仅确保了代码的安全性,还极大地提升了程序的性能。在Rust中,所有权是一种编译时检查机制,用于追踪哪些内存或资源何时可

    2024年03月08日
    浏览(14)
  • Rust语法:所有权&引用&生命周期

    Rust语法:所有权&引用&生命周期

    垃圾回收管理内存 Python,Java这类语言在管理内存时引用了一种叫做垃圾回收的技术,这种技术会为每个变量设置一个引用计数器(reference counter),来统计每个对象的引用次数。 一旦某个对象的引用数为0,垃圾回收器就会择取一个时机将其所占用的空间回收。 以Python为例子

    2024年02月12日
    浏览(12)
  • 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念

    【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 本章节将讲解 Rust 独有的概念(所有权)。所有权是 Rust 最独特的特性,它使得 Rust 能够

    2024年02月10日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包