面试题答案
一键面试1. Rust所有权规则概述
- 所有权唯一性:每个值在 Rust 中都有一个唯一的所有者。当所有者离开作用域时,该值会被自动释放。
- 借用规则:
- 不可变借用:可以有多个不可变借用同时存在,但不能有可变借用。
- 可变借用:同一时间只能有一个可变借用,且不能有不可变借用。
2. 借用检查器工作原理
借用检查器在编译时工作,它会分析代码中变量的生命周期和借用情况。通过确保在同一时间内,对于同一个数据,要么只有不可变借用(允许多个),要么只有一个可变借用,来避免数据竞争。对于悬空指针问题,由于 Rust 自动管理内存,当所有者离开作用域,相关资源被释放,借用检查器会保证不会有其他地方还在引用已释放的数据。
3. 复杂场景下避免问题示例
fn main() {
let mut data = vec![1, 2, 3];
// 不可变借用
let ref1 = &data;
let ref2 = &data;
// 这是合法的,因为多个不可变借用可以共存
println!("ref1: {:?}, ref2: {:?}", ref1, ref2);
// 尝试创建可变借用
// 此时如果有不可变借用,下面这行会编译错误
// let mut ref3 = &mut data;
// 取消注释会报错:cannot borrow `data` as mutable because it is also borrowed as immutable
{
let mut ref3 = &mut data;
// 可变借用期间,不能有不可变借用
// let ref4 = &data;
// 取消注释会报错:cannot borrow `data` as immutable because it is also borrowed as mutable
ref3.push(4);
println!("ref3: {:?}", ref3);
}
// 可变借用ref3离开作用域,这里又可以进行不可变借用
let ref4 = &data;
println!("ref4: {:?}", ref4);
}
在上述示例中,借用检查器确保在同一时间内,数据不会被多个可变借用或者可变与不可变借用同时访问,从而避免了数据竞争。同时,由于 Rust 自动管理内存,不会出现悬空指针的情况,因为当所有者离开作用域,其管理的数据会被释放,借用检查器保证不会有非法引用。