【Rust学习笔记】Rust生命周期参数的详细阐述

本文详细阐述了Rust中的生命周期参数,包括生命周期与借用的关系、函数中的生命周期参数、结构体中的生命周期参数以及静态生命周期参数。通过示例代码解释了如何避免悬垂引用,以及生命周期参数在函数和结构体中的应用,帮助读者更好地理解和掌握Rust的借用规则和生命周期管理。
摘要由CSDN通过智能技术生成

Rust生命周期

程序中每个变量都有一个固定的作用域,当超出变量的作用域以后,变量就会被销毁。变量在作用域中从初始化到销毁的整个过程称之为生命周期。

rust的每个函数都会有一个作用域,也可以在函数中使用一对花括号再内嵌一个作用域。比如如下代码中就在main函数的函数作用域中又内嵌了一个作用域:

fn main() {  let a;       // --------------+-- a start  {            //               |    let b = 5; // -+-- b start  |  }            // -+-- b over   |}              // --------------+-- a over

上面代码存在两个作用域,一个是main函数本身的作用域,另外一个是在main函数中使用一对{}定义了一个内部作用域。第2行代码声明了变量a,它的作用域是整个main函数,也可以说它的生命周期是从第2行代码到第6行代码。在第4行代码中声明了变量b,它的作用域是第4行到第6行。我们可以发现变量的生命周期是有长短的。

生命周期与借用

rust中的借用是指对一块内存空间的引用。rust有一条借用规则是借用方的生命周期不能比出借方的生命周期还要长。

例如:

fn main() {  let a;                // -------------+-- a start  {                     //              |    let b = 5;          // -+-- b start |    a = &b;             //  |           |  }                     // -+-- b over  |  println!("a: {}", a); //              |}                       // -------------+-- a over

上面第5行代码把变量b借给了变量a,所以a是借用方,b是出借方。可以发现变量a(借用方)的生命周期比变量b(出借方)的生命周期长,于是这样做违背了rust的借用规则(借用方的生命周期不能比出借方的生命周期还要长)。因为当b在生命周期结束时,a还是保持了对b的借用,就会导致a所指向的那块内存空间已经被释放了,那么变量a就会是一个悬垂引用。

运行上面代码会报如下错误:

error[E0597]: `b` does not live long enough --> src/main.rs:5:13  |5 |         a = &b;  |             ^^ borrowed value does not live long enough6 |     };  |     - `b` dropped here while still borrowed7 |     println!("a:{}", a);  |                      - borrow later used here

意思就是说变量b的生命周期不够长。变量b已经被销毁了仍然对它进行了借用。

一个正确的例子:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值