面试题答案
一键面试所有权转移
- 调用前:调用函数
transfer_box
之前,调用者拥有box_obj
的所有权。 - 调用时:当函数被调用时,
box_obj
的所有权被转移到函数transfer_box
中。这是因为Box<i32>
类型在传递时,所有权会发生转移。 - 调用后:函数返回一个新的
Box<i32>
,这个新的Box<i32>
的所有权被返回给调用者,而原box_obj
的所有权在函数内部随着函数执行结束而被释放(如果没有返回的话)。
借用检查器保证内存安全
Rust的借用检查器通过以下规则保证内存安全:
- 单一所有权原则:每个值在同一时刻只能有一个所有者。在这个函数中,
box_obj
的所有权从调用者转移到函数内部,不存在同一时刻多个所有者的情况。 - 借用规则:如果存在借用,要么只能有多个不可变借用(共享借用),要么只能有一个可变借用,且不能同时存在可变借用和不可变借用。在本函数中,不存在借用情况,只有所有权转移,这也避免了悬空指针、数据竞争等内存安全问题。
函数实现
struct Box<T>(T);
fn transfer_box(box_obj: Box<i32>) -> Box<i32> {
let value = *box_obj;
let new_value = value * 2;
Box(new_value)
}