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

news/2025/2/25 6:16:37

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 系统级编程能力的基石。


http://www.niftyadmin.cn/n/5864006.html

相关文章

vue3中解决组件间 css 层级问题最佳实践(Teleport的使用)

定义&#xff1a; <Teleport> 是 Vue 3 中引入的一个内置组件&#xff0c;用于将组件的内容渲染到 DOM 中的指定位置&#xff0c;而不受组件层级结构的限制。这在处理模态框、通知、下拉菜单等需要脱离当前组件层级的情况下非常有用。 通俗来说&#xff0c;Teleport的功…

C/C++中的字符串

字符串表示方式&#xff1a; 在C语言中&#xff0c;字符串实际上是一个字符数组&#xff08;字节数组&#xff09;&#xff0c;并且以空字符 \0 结尾。例如&#xff0c;字符串 "RUNOOB" 实际上在内存中表示为 {R, U, N, O, O, B, \0}。这个 \0 终止符告诉标准库函数&…

[AI]【Comfyui】 生成基本流程图的步骤保姆记录

在进行深度学习模型或图像生成的过程中,创建流程图能够帮助清晰地表达模型的工作流程和数据流动。本文将为您介绍生成基本流程图的一般步骤,适用于常见的深度学习图像生成模型。以下是该流程图的基本步骤: 1. 创建 Load Checkpoint 节点 流程图的第一步通常是加载已经训练好…

网页制作07-html,css,javascript初认识のhtml添加多媒体

在网页中&#xff0c;&#xff0c;除了可以添加文本和图像之外还可以插入动画声音视频等媒体元素&#xff0c;如滚动效果、 Flash、 Active x以及midi声音文件等 一、设置滚动效果 1、滚动标记marquee 1)简介:使用marquee标记不仅可以滚动文字&#xff0c;也可以移动图片表格…

2025雅森北京展今天开幕,全景展现新能源汽车时代

推动汽车后市场全产业链向新向优转型升级 在2月21日举行的第36届中国国际汽车服务用品及设备展览会&#xff0c;中国国际新能源汽车技术、零部件及服务展览会&#xff08;雅森北京展CIAACE&#xff09;上&#xff0c;雅森国际总裁谢宇表示&#xff0c;当前正处在汽车行业新旧动…

鸿蒙5.0实战案例:基于ArkUI的验证码实现

往期推文全新看点&#xff08;文中附带全新鸿蒙5.0全栈学习笔录&#xff09; ✏️ 鸿蒙&#xff08;HarmonyOS&#xff09;北向开发知识点记录~ ✏️ 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ ✏️ 鸿蒙应用开发与鸿蒙系统开发哪个更有前景&#…

使用Adobe Premiere Pro 2024软件实现多图片水平划出切换

使用Adobe Premiere Pro 2024软件实现多图片水平划出切换 步骤总结 纯PR新手操作&#xff0c;有误见谅。目标&#xff1a;试图使用PR2024实现图片间的水平滑入滑出切换&#xff0c;以对比相同内容不同图片之间的质量。实现效果&#xff1a;例如&#xff0c;有AB两图像&#xff…

【JavaEE进阶】Spring DI

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 依赖注⼊是⼀个过程&#xff0c;是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源&#xff0c;⽽资源指的就是对象. 在上⾯程序案例中&#xff0c;我们使⽤了 Autowired 这…