面试题答案
一键面试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
关键字将所有权转移给新线程,使得新线程对字符串有完全的控制权,直至线程结束释放内存。