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已经被销毁了仍然对它进行了借用。
一个正确的例子: