[英]Why the mutable reference parameter of a closure doesn't outlive the function call?
[英]Why doesn't this closure outlive var?
考慮以下 Rust 代碼:
use std::thread;
fn main() {
bar();
loop {}
}
fn bar() {
let var = b"foo";
thread::spawn(|| {
write(var);
});
}
fn write(d: &[u8]) {
println!("{:?}", d)
}
據我了解, var
在 function bar
的堆棧上,它返回后不再存在。
盡管如此,新線程之后仍會訪問它並成功寫入數據。
據我了解,
var
在 functionbar
的堆棧上,它返回后不再存在。
var
只是類型&'static [u8; 3]
的引用 &'static [u8; 3]
。 這個引用值是堆棧上的值,而不是字符串文字。
字節字符串文字b"foo"
的所有者是程序 binary ,這導致字符串文字具有'static
生命周期,因為它存在於正在運行的程序的整個生命周期中。
b"foo"
值實際上並不存在於堆棧中。 它存儲在已編譯二進制文件的只讀 memory 中,並具有'static
生命周期”。
考慮這個替代示例:
fn bar() {
let var = format!("foo");
thread::spawn(|| {
write(&var);
});
}
fn write(d: &str) {
println!("{:?}", d)
}
這是行不通的(除非您在閉包之前添加move
),因為var
(類型為String
)是在堆棧上分配的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.