MST

星途 面试题库

面试题:Rust智能指针的内存安全与所有权转移

假设你有一个函数`fn transfer_box(box_obj: Box<i32>) -> Box<i32>`,在函数内部,你需要对`box_obj`进行一些操作,然后返回一个新的`Box<i32>`。请解释函数调用前后所有权是如何转移的,以及Rust的借用检查器是如何保证内存安全的。同时,实现这个函数,要求对`box_obj`的值翻倍后返回新的`Box<i32>`。
42.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

所有权转移

  1. 调用前:调用函数transfer_box之前,调用者拥有box_obj的所有权。
  2. 调用时:当函数被调用时,box_obj的所有权被转移到函数transfer_box中。这是因为Box<i32>类型在传递时,所有权会发生转移。
  3. 调用后:函数返回一个新的Box<i32>,这个新的Box<i32>的所有权被返回给调用者,而原box_obj的所有权在函数内部随着函数执行结束而被释放(如果没有返回的话)。

借用检查器保证内存安全

Rust的借用检查器通过以下规则保证内存安全:

  1. 单一所有权原则:每个值在同一时刻只能有一个所有者。在这个函数中,box_obj的所有权从调用者转移到函数内部,不存在同一时刻多个所有者的情况。
  2. 借用规则:如果存在借用,要么只能有多个不可变借用(共享借用),要么只能有一个可变借用,且不能同时存在可变借用和不可变借用。在本函数中,不存在借用情况,只有所有权转移,这也避免了悬空指针、数据竞争等内存安全问题。

函数实现

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)
}