为什么Rust需要明确的生命周期?

我正在阅读Rust书的生命周章,我在这个例子中看到了命名/显式生命周期:


struct Foo<'a> {

    x: &'a i32,

}


fn main() {

    let x;                    // -+ x goes into scope

                              //  |

    {                         //  |

        let y = &5;           // ---+ y goes into scope

        let f = Foo { x: y }; // ---+ f goes into scope

        x = &f.x;             //  | | error here

    }                         // ---+ f and y go out of scope

                              //  |

    println!("{}", x);        //  |

}                             // -+ x goes out of scope

我很清楚,编译器阻止的错误是在内部作用域完成后分配给的引用的释放x后使用,f因此&f.x变为无效,并且不应该被分配给x。


我的问题是,在不使用显式 'a生命周期的情况下,可以很容易地分析问题,例如通过推断对更宽范围的引用的非法分配(x = &f.x;)。


在哪些情况下实际需要明确的生命周期来防止使用后免费(或其他一些类?)错误?


慕工程0101907
浏览 779回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP