MST

星途 面试题库

面试题:Rust内存管理机制中的所有权规则及应用

请详细阐述Rust的所有权规则,并且举例说明在一个简单的函数调用场景中,所有权是如何转移和生效的。
32.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

Rust的所有权规则

  1. 每个值都有一个变量作为其所有者:在Rust中,每个值在内存中有且仅有一个所有者。例如:
let s = String::from("hello");

这里sString类型值"hello"的所有者。 2. 值在任一时刻有且只有一个所有者:不能同时有两个变量拥有同一个值的所有权。例如以下代码会报错:

let s1 = String::from("hello");
let s2 = s1; // s1的所有权转移给了s2,此时s1不再拥有该值,若再使用s1会报错
// println!("{}", s1); // 这行代码会报错,因为s1已失去所有权
  1. 当所有者离开作用域,这个值将被丢弃:当变量离开其作用域(scope)时,Rust会自动调用drop函数来清理该变量所拥有的值占用的资源。例如:
{
    let s = String::from("world"); // s进入作用域
    // 在这里可以使用s
} // s离开作用域,Rust自动调用drop函数释放s所占用的资源

简单函数调用场景中所有权的转移和生效

fn take_ownership(some_string: String) {
    println!("{}", some_string);
} // some_string离开作用域,被丢弃

fn main() {
    let s = String::from("hello, world");
    take_ownership(s); // s的所有权转移给函数take_ownership中的参数some_string
    // println!("{}", s); // 这行代码会报错,因为s的所有权已转移
}

在上述代码中,main函数中创建了String类型的变量s。当调用take_ownership函数并传递s时,s的所有权转移给了函数参数some_string。此时在main函数中s不再拥有该字符串的所有权,若尝试访问s会导致编译错误。而在take_ownership函数中,some_string成为该字符串的所有者,当函数执行完毕,some_string离开作用域,其所拥有的字符串资源被释放。