给定以下函数定义:
// A: Compiles with static lifetime
fn foo() -> &'static i32 {
let i = &42;
i
}
// B: Compiles with normal lifetime
fn bar<'a>() -> &'a i32 {
let i = &42;
i
}
// C: Does not compile but same as B
fn baz<'a>() -> &'a i32 {
let i = 42;
&i
}
// D: Does not compile either
fn qux() -> &i32 {
let i = &42;
i
}
我预计这4个函数都会编译失败,因为我们返回的是对局部变量的引用,但令我惊讶的是,A和B都能正确编译,而C和D却不能.
对于A:这里怎么可能使用'static
,因为静态数据lives for the lifetime of the program和该数据是在程序执行期间动态(可能多次)创建的?
对于B:为什么这是允许的,'a
的生命周期是多少-它也隐含着'static
吗?当更改为String
等类型时,为什么这不再起作用?
对于C和D:当它们实际上与B相同时,为什么不编译它们?
这些有没有制造悬而未决的指针,或者幕后发生了什么?
它们会因为返回值永远存在而造成内存泄漏吗?