MST
星途 面试题库

面试题:Rust结构体移动语义中的所有权转移

请解释在Rust中,当一个包含堆分配数据(如`String`类型成员)的结构体被移动时,所有权是如何转移的?举例说明。
34.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 所有权转移原理
    • 在Rust中,每个值都有一个唯一的所有者。当一个包含堆分配数据(如String类型成员)的结构体被移动时,所有权发生转移。这意味着原来的所有者不再拥有该堆分配数据,新的所有者接管其所有权。
    • 移动操作避免了数据的复制,因为Rust通过移动所有权来管理内存,提高了效率。当结构体移动时,结构体中堆分配数据(如String)的内部指针、长度和容量等信息也被移动到新的所有者,而不是复制堆上的数据。
  2. 举例说明
struct MyStruct {
    data: String,
}

fn main() {
    let s1 = MyStruct {
        data: String::from("hello"),
    };
    let s2 = s1; // s1的所有权转移给s2,此时s1不再有效

    // 以下代码会编译错误,因为s1已不再拥有数据
    // println!("{}", s1.data);

    println!("{}", s2.data);
}

在上述代码中,s1创建时拥有MyStruct结构体中String类型的data成员的所有权。当let s2 = s1;执行时,s1的所有权转移给 s2s1不再有效。尝试访问s1.data会导致编译错误,而可以正常访问s2.data,因为 s2现在是data的所有者。