面试题答案
一键面试在Rust中,通过借用规则和生命周期标注来确保引用的生命周期合法,避免悬垂指针问题。以下是一个具体的代码示例及其分析:
// 定义第一个结构体
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 };
// 使用outer
println!("Inner data via Outer: {}", outer.inner_ref.data);
}
代码分析
-
结构体定义:
Inner
结构体包含一个i32
类型的成员data
。Outer
结构体包含一个对Inner
实例的引用inner_ref
。这里使用了生命周期参数'a
,表示inner_ref
的生命周期至少为'a
。
-
main
函数:- 首先创建了一个
Inner
实例inner
。这个实例在栈上分配内存。 - 然后创建了一个
Outer
实例outer
,并将inner
的引用传递给outer
。此时,outer
的生命周期依赖于inner
的生命周期。 println!
语句通过outer
访问inner
的data
成员。
- 首先创建了一个
-
栈内存生命周期管理:
inner
在栈上创建,其生命周期从创建开始,到main
函数结束时结束。outer
也在栈上创建,它的inner_ref
引用指向inner
。由于outer
的生命周期依赖于inner
,只要outer
存在,inner
就不会被销毁。- 当
main
函数结束时,outer
先被销毁,然后inner
被销毁,不存在悬垂指针的问题。因为Rust的借用规则确保了只要有引用存在,被引用的对象就不会被销毁。
通过这种方式,Rust在编译时就能检查并确保引用的生命周期合法,从而避免了悬垂指针问题。