MST

星途 面试题库

面试题:Rust多线程中生命周期的基本应用

在Rust中,假设有一个多线程程序,主线程创建了一个字符串`String`,并希望将其传递给一个新线程进行处理。请写出一个简单示例代码,并阐述如何正确处理字符串的生命周期,以避免悬垂指针或内存泄漏等问题。
37.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::thread;

fn main() {
    let s = String::from("Hello, Rust!");

    let handle = thread::spawn(move || {
        println!("Thread received: {}", s);
    });

    handle.join().unwrap();
}

在这个示例中,使用move关键字将String类型的s所有权转移到新线程中。move闭包会获取其捕获变量的所有权,这样就保证了新线程拥有字符串的唯一所有权。由于String类型负责管理自己的内存,当线程结束时,String会自动释放其占用的内存,从而避免了悬垂指针和内存泄漏问题。如果不使用move关键字,闭包默认以不可变借用的方式捕获变量,但是thread::spawn创建的新线程可能会比主线程存活时间更长,不可变借用在主线程结束时就会失效,从而导致悬垂指针问题。使用move关键字将所有权转移给新线程,使得新线程对字符串有完全的控制权,直至线程结束释放内存。