面试题答案
一键面试- 所有权转移原理:
- 在Rust中,每个值都有一个唯一的所有者。当一个包含堆分配数据(如
String
类型成员)的结构体被移动时,所有权发生转移。这意味着原来的所有者不再拥有该堆分配数据,新的所有者接管其所有权。 - 移动操作避免了数据的复制,因为Rust通过移动所有权来管理内存,提高了效率。当结构体移动时,结构体中堆分配数据(如
String
)的内部指针、长度和容量等信息也被移动到新的所有者,而不是复制堆上的数据。
- 在Rust中,每个值都有一个唯一的所有者。当一个包含堆分配数据(如
- 举例说明:
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
的所有权转移给 s2
,s1
不再有效。尝试访问s1.data
会导致编译错误,而可以正常访问s2.data
,因为 s2
现在是data
的所有者。