Rust 的内存管理机制

ops/2025/2/9 12:41:02/

Rust 的内存管理机制是其最核心的创新之一,它通过 所有权系统(Ownership)借用检查器(Borrow Checker)生命周期(Lifetimes) 在编译期静态保障内存安全,无需垃圾回收(GC)且避免手动管理内存的错误。下面通过代码示例详细解析其机制和安全性原理:


1. 所有权系统(Ownership)

所有权规则
  1. 每个值有且只有一个所有者
  2. 当所有者离开作用域,值会被自动释放(RAII 机制)。
  3. 赋值或传参时,所有权会转移(Move),原变量失效。
示例 1:所有权的转移
rust">fn main() {let s1 = String::from("hello"); // s1 是所有者let s2 = s1;                    // 所有权转移给 s2,s1 失效// println!("{}", s1);          // 编译错误!s1 已失去所有权println!("{}", s2);             // 正常输出
} // s2 离开作用域,内存自动释放
  • 安全性:避免多个变量指向同一堆内存,防止重复释放(Double Free)。
示例 2:函数传参的所有权转移
rust">fn take_ownership(s: String) { // s 获得所有权println!("{}", s);
} // s 离开作用域,内存释放fn main() {let s = String::from("hello");take_ownership(s);          // s 的所有权转移给函数// println!("{}", s);       // 编译错误!s 已失效
}

2. 借用(Borrowing)

通过 引用(Reference) 借用值,无需转移所有权,分为 不可变引用(&T)可变引用(&mut T)

借用规则
  1. 同一作用域内,要么有多个不可变引用,要么只有一个可变引用
  2. 引用必须始终有效(生命周期检查)。
示例 3:不可变引用
rust">fn main() {let s = String::from

http://www.ppmy.cn/ops/156969.html

相关文章

uniapp 使用 tree.js 解决模型加载不出来的问题

网上有很多uniapp使用tree.js的教程,但是我在使用测试中,发现tree.js的官方3d模型中有很多加载不出来,但是也没有报错,全网搜也没搜到方法,最后发现是缩放的问题,这里将代码贴出来,关键的方法是…

MySQL基于binlog和gtid主从搭建方案

MySQL基于binlog和gtid主从搭建方案 一.主库配置 1.1 确认 binlog 是否开启 SHOW VARIABLES LIKE %log_bin%; 1.2 创建日志目录并设置权限 mkdir -p /opt/mysql/log_bin chown -R mysql:mysql /usr/local/mysql chmod -R 755 /usr/local/mysql 1.3 修改 my.cnf 配置文件 …

【Linux】28.Linux 多线程(2)

文章目录 5. Linux线程互斥5.1 进程线程间的互斥相关背景概念5.2 互斥量mutex5.2.1 互斥量的接口5.2.2 销毁互斥量5.2.3 互斥量加锁和解锁 5.3 互斥量实现原理探究5.4 互斥量的封装 6. 可重入VS线程安全6.1 常见的线程不安全的情况:6.2 常见的线程安全的情况6.3 常见…

LeetCode 106.从中序与后序遍历序列构造二叉树

题目描述 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&am…

LIMO:少即是多的推理

25年2月来自上海交大、SII 和 GAIR 的论文“LIMO: Less is More for Reasoning”。 一个挑战是在大语言模型(LLM)中的复杂推理。虽然传统观点认为复杂的推理任务需要大量的训练数据(通常超过 100,000 个示例),但本文展…

OSPF基础(2):数据包详解

OSPF数据包(可抓包) OSPF报文直接封装在IP报文中,协议号89 头部数据包内容: 版本(Version):对于OSPFv2,该字段值恒为2(使用在IPV4中);对于OSPFv3,该字段值恒为3(使用在IPV6中)。类型(Message Type):该OSPF报文的类型。…

51单片机看门狗系统

在 STC89C52 单片机中,看门狗控制寄存器的固定地址为 0xE1。此地址由芯片厂商在硬件设计时确定,但是它在头文件中并未给出,因此在使用看门狗系统时需要声明下这个特殊功能寄存器 sfr WDT_CONTR 0xE1; 本案将用一个小灯的工作状况来展示看门…

unity碰撞的监测和监听

1.创建一个地面 2.去资源商店下载一个火焰素材 3.把procedural fire导入到自己的项目包管理器中 4.给magic fire 0 挂在碰撞组件Rigidbody , Sphere Collider 5.创建脚本test 并挂在magic fire 0 脚本代码 using System.Collections; using System.Collections.Generic; usi…