// 定义User结构体
struct User {
name: String,
age: u32,
}
// 定义打印函数
fn print_user(user: User) {
println!("Name: {}, Age: {}", user.name, user.age);
}
fn main() {
let user1 = User {
name: String::from("Alice"),
age: 30,
};
// 调用print_user函数,user1的所有权转移给print_user
print_user(user1);
// 这里不能再使用user1,因为其所有权已转移
// println!("{:?}", user1); // 这行代码会报错
}
所有权转移情况
- 在
main
函数中创建了user1
实例,此时user1
拥有其内部name
字符串的所有权。
- 调用
print_user
函数时,user1
的所有权被转移给print_user
函数的参数user
。这意味着main
函数不再拥有user1
的所有权。
print_user
函数结束后,user
被销毁,其内部的name
字符串也会被释放。
生命周期有效性确保
- 在Rust中,结构体
User
的生命周期由其字段的生命周期决定。这里name
是String
类型,有自己的生命周期管理。
- 函数
print_user
的参数user
的生命周期与函数调用的生命周期一致。由于user
拥有User
实例的所有权,在函数调用期间,user
及其内部字段(name
和age
)都是有效的。
- Rust编译器在编译时会进行所有权和生命周期检查,确保在
print_user
函数调用结束后,不会再访问已经转移所有权的user1
,从而保证了内存安全。如果尝试在print_user
调用后访问user1
,编译器会报错,如上述被注释掉的代码行。