不安全指定生命周期的例子都有哪些? [复制]
Posted
技术标签:
【中文标题】不安全指定生命周期的例子都有哪些? [复制]【英文标题】:What are the examples of unsafely specified lifetimes? [duplicate]不安全指定生命周期的例子有哪些? [复制] 【发布时间】:2020-03-12 05:34:30 【问题描述】:过去三天我一直在学习生命周期主题,现在它们开始对我有意义。但是,我进行了很多实验,但没有设法以某种方式指定生命周期,因为它们会导致 runtime 不安全的行为,因为编译器似乎足够聪明,可以防止这种情况,通过不编译。 因此,我有以下一系列问题:
Rust 编译器是否会捕获每一种不安全的生命周期说明符使用情况?
如果是,那么为什么 Rust 需要手动指定生命周期,而它可以通过推断不安全场景自行完成?或者它只是一个遗物,一旦编译器变得足够强大,可以在任何地方进行生命周期省略,它就会消失? 如果不是,不安全生命周期说明符使用的示例(是示例)是什么?他们会清楚地证明手动指定生命周期的必要性。【问题讨论】:
【参考方案1】:除非您使用不安全的代码(在函数中或其他地方),否则不可能(除非有任何编译器错误)使用生命周期说明符引发未定义的行为。然而,生命周期说明符仍然是必要的,因为有时正确的生命周期应该是模糊的。例如:
fn foo(bar: &i32, baz: &i32) -> &i32
// ...
返回类型的生命周期应该是多少?编译器无法推断这一点,因为它可能与bar
或baz
相关联,并且每种情况都会影响返回值的持续时间,从而影响函数的使用方式。函数体不能用于推断生命周期,因为类型和生命周期检查必须能够仅使用函数的签名来完成。消除这种歧义的唯一方法是明确说明返回值应具有的生命周期:
fn foo<'a>(bar: &i32, baz: &'a i32) -> &'a i32
// ...
您可以阅读有关生命周期省略规则的更多信息here。
【讨论】:
以上是关于不安全指定生命周期的例子都有哪些? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
什么是Service以及描述下它的生命周期。Service都有哪些启动方法,有什么区别,怎样停用Service?