Rust 的内存管理机制

news/2025/2/8 1:16:29/

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/news/1570196.html

相关文章

websocket自动重连封装

websocket自动重连封装 前端代码封装 import { ref, onUnmounted } from vue;interface WebSocketOptions {url: string;protocols?: string | string[];reconnectTimeout?: number; }class WebSocketService {private ws: WebSocket | null null;private callbacks: { [k…

从零开始部署Dify:后端与前端服务完整指南

从零开始部署Dify:后端与前端服务完整指南 一、环境准备1. 系统要求2. 项目结构 二、后端服务部署1. 中间件启动(Docker Compose)2. 后端环境配置3. 依赖安装与数据库迁移4. 服务启动 三、前端界面搭建1. 环境配置2. 服务启动 四、常见问题排…

因果推断与机器学习—可解释性、公平性和因果机器学习

随着人工智能技术的飞速发展,如人脸识别、自动驾驶、智能音箱和手术机器人等在社会各领域广泛应用,人工智能已成为科技革命和产业变革的核心驱动力。然而,在带来便利的同时,也引发了一系列问题: 数据统计:2016 年,基于美国食品和药物管理局(U.S. Food and Drug Adminis…

vue3 的 onScopeDispose 是什么作用

onScopeDispose 是 Vue 3 中用于管理响应式副作用的一个重要 API,主要用于在当前活跃的 effect 作用域上注册一个处理回调函数。当这个作用域停止时,所注册的回调函数会被调用。这种机制使得开发者能够有效地清理和管理资源,尤其是在组合式函…

windows系统中docker根据Dockerfile文件部署jar包到容器中

第一步:在windows下安装docker容器(忽略,自行百度一下)。 第二步:在IDEA中打包jar包 第三步:准备Dockerfile文件 FROM registry.cn-hangzhou.aliyuncs.com/hzbs/eclipse-temurin:17WORKDIR /appCOPY pla…

【教学】推送docker仓库

引言 Docker Hub 这个最常见的公共 Docker 仓库为例,本文将介绍如何把本地 Docker 镜像推送到公共 Docker 仓库 1. 注册 Docker Hub 账号 如果你还没有 Docker Hub 账号,需要先在 Docker Hub 官网 进行注册。注册完成后,记住你的用户名和密…

JS实现一个通用的循环填充数组的方法

function createFilledArray(length, pattern) {return Array.from({ length }, (_, i) > pattern[i % pattern.length]); }// 示例 const result createFilledArray(8, [1, 2, 3]);console.log(result); // [1, 2, 3, 1, 2, 3, 1, 2]解析: createFilledArray(…

图书管理系统 Axios 源码__编辑图书

目录 功能概述: 代码实现(index.js): 代码解析: 图书管理系统中,删除图书功能是核心操作之一。下是基于 HTML、Bootstrap、JavaScript 和 Axios 实现的删除图书功能的详细介绍。 功能概述: …