面试题答案
一键面试代码实现
// 定义被引用的结构体
struct Inner {
data: i32,
}
// 定义包含对Inner结构体引用的结构体
struct Outer<'a> {
inner_ref: &'a Inner,
}
fn main() {
let inner = Inner { data: 42 };
let outer = Outer { inner_ref: &inner };
println!("Inner data: {}", outer.inner_ref.data);
}
生命周期标注确保引用有效性
在 Rust 中,通过生命周期标注(这里是 'a
)来确保引用的有效性。在 Outer
结构体定义中,&'a Inner
表示 inner_ref
引用的 Inner
实例的生命周期至少与 'a
一样长。在 main
函数中,inner
实例的生命周期开始于其定义处,结束于 main
函数末尾。当创建 outer
时,将 inner
的引用赋给 outer.inner_ref
,由于 inner
的生命周期覆盖了 outer
的整个生命周期,所以引用是有效的。
与所有权机制的协同工作
所有权机制规定每个值都有一个所有者,当所有者离开其作用域时,值会被销毁。在这个例子中,inner
的所有者是 main
函数栈中的变量 inner
。而引用(这里的 inner_ref
)并不拥有它所指向的值,它只是借用了这个值。生命周期标注与所有权机制协同工作,确保在引用存在期间,被引用的值不会被销毁。如果没有正确的生命周期标注,编译器会报错,防止出现悬空引用(dangling reference),从而保证内存安全。