【 Rust 基础】内存管理 —— Rust 的神级语法04

本文深入探讨Rust编程语言中的内存管理机制,重点讲述所有权规则、移动(move)概念,以及不可变引用和可变引用的使用。通过实例解析所有权的转移和借用,包括Slices在部分借用中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

每一个程序都会采用一定的方式管理其占用的内存,通过 Rust 写出的程序也不例外。但在 Rust 中,它既不依赖于程序员自由地管理内存,也不依赖于垃圾回收,而是利用新颖的 所有权 来管理着程序拥有的内存。

所有权 是 Rust 的核心功能之一,用耐心与细心去掌握它!

一、所有权

所有权 的规则很简单:

  1. Rust 中的每一个值都有一个被称为 所有者(owner) 的变量。
  2. 值有且只有一个所有者。
  3. 当所有者(变量)离开 作用域(scope) ,这个值将被丢弃。

所有者的概念很好理解,然而 作用域 是什么玩意?

  • 一个项(item)在程序中有效的范围我们将其成为该项的作用域。

一般来说来说,大括号:“{}”中间所包括的空间即为其内部项的作用域。

打个比方:

fn main() {
   
    {
   
        let mut number = 0;
    }
    number  = 1;
}

编译下代码:

error[E0425]: cannot find value number in this scope
src/main.rs:5:5 | 5 | number = 1; |
^^^^^^ not found in this scope

在当前作用域找不到 number

如果把 let mut number = 1; 的外部的大括号删除:

warning: value assigned to number is never read

虽然因为未使用 number 变量编译器进行了警告,但显然我们已经解决了之前的错误。

目前为止,Rust 所有权功能似乎与其他语言的变量管理机制相仿,为了了解所有权机制的不同之处,我们得继续深入了解一番。

先来一段代码:

fn main() {
   
    let number = 0;
    let temp = number;
    println!("{}",number);
    println!("{}",temp);
}

编译正常,输出:

0
0

然而,如果是字符串呢?

fn main() {
   
    let s = String::from("看看帅气能否传递!");
    let temp = s;
    println!("{}",s);
    println!("{}",temp);
}

error[E0382]: borrow of moved value: s

这又是为什么呢?

要明白这点,就得了解 Rust 的另一个机制:移动(move)

在其他语言中,一个变量赋值给另一个变量的方式有两种:浅拷贝 与 深拷贝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值