检查引用何时仍被使用
一个引用不能比它所借用的值活得更久,否则后续访问可能指向已经失效的对象。Rust的借用检查器比较这些有效期约束,让返回局部变量引用等情况在编译阶段被拒绝。
借用约束也处理别名与修改:在相关借用仍然有效时,通常只能有一个独占可变引用,或者多个共享引用。规则针对可重叠的使用,而不是仅按源文件中出现过几个取引用符号计数。
最后一次使用可以早于块结束
引用的相关使用范围并不必总延续到所在代码块的右花括号。Rust教材展示在共享引用最后一次使用之后创建可变引用;先前的借用已经不再阻挡后续访问,即使这些变量写在同一个块内。
这种分析让许多按实际使用先后并不冲突的代码通过检查。若在修改后还要继续使用旧共享引用,约束就不同;把变量名仍可见与借用仍需有效混为一谈,会误解检查器作出的判断。
参考:[1]
静态规则与运行时检查的边界
静态分析必须根据可获得的信息作出保守判断,因此被拒绝并不自动证明某段程序在所有实际执行中都会出错。明确的生命周期标注可以表达引用之间的关系,却不能任意延长底层值的存在时间。
RefCell<T>把相应借用规则放到运行时检查,违反时会引发panic;unsafe实现则须自行维护安全接口的条件。借用检查成功也不等于算法结果正确,类型与内存访问条件之外仍有程序逻辑需要验证。