rust学习笔记5-所有权机制

rust核心就是所有权机制,是其内存管理的核心特性,旨在消除内存安全问题(如空指针、悬垂指针、内存泄漏等)而无需依赖垃圾回收(GC)

1.首先看一下语义模型

当声明一个变量 let a = "32";它的语义模型如下:

当声明一个变量时候,它就绑定了一个数据、scope以及一片内存区域,它就拥有一个所有权,并且它的所有权是可以出借(引用)的,变量不管是拥有还是引用,它都可以设置为可变和不可变,默认为不可变,拥有所有权的变量离开当前scope进入新scope时候,会调用Move(Copy)。同时它的生命周期(LifeTime)和内存管理机制Rall也在所有权机制下进行,只有拥有这个变量的所有权,才能对它进行内存释放、销毁等操作。

2.所有权的类型系统

rust语言它的编译器遵循一种仿射类型(Affine Type)下的一个子结构类型系统(SubstructuralType Systems),资源最多被使用一次,具体实现就Move(Copy)。

3.内存管理

默认存储数据到栈上,如整形、浮点、布尔、枚举等

利用栈来自动管理堆内存,如数组、元组、字符串等

4.借用(Borrowing)

通过引用(&)借用值,避免所有权转移:

不可变引用(&T)

允许同时存在多个不可变引用,但不能修改值。

rust 复制代码
let s = String::from("hello");
let len = calculate_length(&s); // 借用 s
println!("s is still valid: {}", s); // 合法

fn calculate_length(s: &String) -> usize {
    s.len()
}

可变引用(&mut T)

同一作用域内,同一数据只能有一个可变引用,且不能与其他引用共存:

rust 复制代码
let mut s = String::from("hello");
let s_ref = &mut s;
s_ref.push_str(", world");
// let s_ref2 = &mut s; // 编译错误:同一作用域只能有一个可变引用

5.所有权共亨

rust所有权共享有两种一种是clone,另一种是copy,区别在于,clone是要求编写代码自己去调用,copy是在编译的时候,编译自己完成,不需要自己去调用

rust 复制代码
fn main() {
    //基本类型(如 i32、bool)实现了 Copy trait,赋值时直接复制值而非转移所有权:
    let x = 5;
    let y = x; // 复制值,x 仍有效
    println!("x = {}, y = {}", x, y);
    //Rust会尽可能地降低程序的运行成本,所以默认情况下,长度较大的数据存放在堆中,
    //且采用移动的方式进行数据交互。但如果需要将数据单纯的复制一份以供他用,可以使用clone
    let s1 = String::from("hello");
    let s2 = s1.clone();
    println!("s1 = {}, s2 = {}", s1, s2);

}

总结

Rust 的所有权机制通过编译时静态检查强制开发者遵循内存安全规则。虽然初期需要适应所有权转移、借用和生命周期等概念,但它能从根本上解决内存安全问题,是 Rust 系统级编程能力的基石。

相关推荐
.小墨迹9 分钟前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
ZH154558913119 分钟前
Flutter for OpenHarmony Python学习助手实战:模块与包管理的实现
python·学习·flutter
山岚的运维笔记23 分钟前
SQL Server笔记 -- 第20章:TRY/CATCH
java·数据库·笔记·sql·microsoft·sqlserver
Gain_chance26 分钟前
33-学习笔记尚硅谷数仓搭建-DWS层交易域用户粒度订单表分析及设计代码
数据库·数据仓库·hive·笔记·学习·datagrip
hqyjzsb30 分钟前
盲目用AI提效?当心陷入“工具奴”陷阱,效率不增反降
人工智能·学习·职场和发展·创业创新·学习方法·业界资讯·远程工作
承渊政道1 小时前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
lpfasd1231 小时前
两个美国:精英的知识崇拜与底层的反智驯化
笔记
清水迎朝阳1 小时前
解锁读书新体验--有声小说书屋 本地网站的 标注笔记功能
笔记·电子书·读书·标注·有声小说
驭渊的小故事2 小时前
简单模板笔记
数据结构·笔记·算法
野犬寒鸦3 小时前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习