MST

星途 面试题库

面试题:Rust中Vec和String集合的生命周期管理

在Rust中,假设有一个函数接收一个`Vec<String>`并处理其中的字符串。请描述在函数内部和函数返回后,这些`String`和`Vec`的生命周期是如何管理的?给出简单代码示例并解释。
19.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

生命周期管理描述

  1. 函数内部Vec<String>被传入函数后,其所有权被函数接管。函数可以自由地访问和修改Vec及其包含的String实例。String实例在Vec的内存空间内存储,它们的生命周期与Vec紧密相关。只要Vec在作用域内,其包含的String也在作用域内。
  2. 函数返回后:如果函数返回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实例被销毁
}

代码解释

  1. process_strings函数接收Vec<String>作为参数。在函数内部,通过iter_mut方法遍历Vec中的String实例并进行修改。
  2. 函数返回修改后的Vec<String>,所有权转移给调用者。
  3. main函数中,创建了original Vec<String>,然后将其所有权传递给process_strings函数,original在传递后不再可用。
  4. processed接收返回的Vec<String>,拥有其所有权。当processed离开main函数的作用域时,Vec及其包含的String实例会被销毁,释放内存。