MST

星途 面试题库

面试题:Rust内存模型下的借用规则与生命周期

编写一段Rust代码,包含一个结构体,结构体中有一个引用类型的字段。要求在函数中创建结构体实例并使用,同时遵循Rust的借用规则和生命周期标注。解释代码中生命周期标注的作用以及为什么要这样标注,说明如果不遵循借用规则会出现什么编译错误。
26.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义一个结构体,包含一个引用类型的字段
struct MyStruct<'a> {
    data: &'a i32,
}

// 定义一个函数,创建结构体实例并使用
fn main() {
    let num = 42;
    let my_struct = MyStruct { data: &num };
    println!("The data is: {}", my_struct.data);
}

生命周期标注的作用

  1. 在结构体定义 MyStruct<'a> 中的 'a:这个生命周期参数 'a 标注了结构体中引用字段 data 的生命周期。它表示 data 所引用的数据的生命周期至少和 MyStruct 实例的生命周期一样长。
  2. 在字段定义 data: &'a i32 中的 'a:这里明确指定了 data 是一个指向 i32 类型数据的引用,并且这个引用的生命周期是 'a

为什么要这样标注

如果不标注生命周期,Rust 编译器无法确定引用的生命周期关系。在这个例子中,MyStruct 实例持有一个引用,编译器需要知道这个引用的生命周期范围,以确保在 MyStruct 实例存在期间,所引用的数据不会被释放。通过标注 'a,我们向编译器表明 data 引用的数据在 MyStruct 实例的生命周期内都是有效的。

不遵循借用规则会出现的编译错误

  1. 悬垂引用:如果所引用的数据在 MyStruct 实例之前被释放,就会出现悬垂引用。例如,如果在创建 MyStruct 实例后,提前释放了 num,编译器会报错,因为 MyStruct 中的 data 引用了一个已释放的变量。
  2. 借用检查错误:如果试图在不符合借用规则的情况下使用引用,比如在同一作用域内同时有可变借用和不可变借用,编译器会报错。例如,若在 my_struct 存在时尝试修改 num,会违反借用规则,编译器会提示错误信息,告知存在借用冲突。