生命周期管理描述
- 函数内部:
Vec<String>
被传入函数后,其所有权被函数接管。函数可以自由地访问和修改Vec
及其包含的String
实例。String
实例在Vec
的内存空间内存储,它们的生命周期与Vec
紧密相关。只要Vec
在作用域内,其包含的String
也在作用域内。
- 函数返回后:如果函数返回
Vec<String>
,所有权被转移到调用者。调用者现在负责管理Vec
及其包含的String
的生命周期。当Vec
离开调用者的作用域时,Vec
及其包含的所有String
实例会被销毁,相关内存会被释放。如果函数没有返回Vec<String>
(例如通过消耗Vec
并返回其他类型,或者修改Vec
并将其作为参数传出去),那么Vec
及其包含的String
实例会在函数结束时被销毁。
代码示例
fn process_strings(vec: Vec<String>) -> Vec<String> {
// 在函数内部,vec拥有其包含的String实例的所有权
for mut s in vec.iter_mut() {
s.push_str(" processed");
}
// 返回修改后的Vec,所有权转移给调用者
vec
}
fn main() {
let original = vec![String::from("hello"), String::from("world")];
let processed = process_strings(original);
// 这里original不再可用,因为所有权已经转移到process_strings函数中
// processed现在拥有Vec<String>及其包含的String实例的所有权
for s in processed {
println!("{}", s);
}
// processed离开作用域,其包含的所有String实例被销毁
}
代码解释
process_strings
函数接收Vec<String>
作为参数。在函数内部,通过iter_mut
方法遍历Vec
中的String
实例并进行修改。
- 函数返回修改后的
Vec<String>
,所有权转移给调用者。
- 在
main
函数中,创建了original
Vec<String>
,然后将其所有权传递给process_strings
函数,original
在传递后不再可用。
processed
接收返回的Vec<String>
,拥有其所有权。当processed
离开main
函数的作用域时,Vec
及其包含的String
实例会被销毁,释放内存。