名字可见与对象存在并不相同
作用域讨论名字在代码的哪些位置可以使用,生命周期则讨论对象在执行中何时存在。一个局部绑定离开作用域后,其所管理的资源可能随之清理;但仍有其他管理规则能够让共享对象继续存在。
反过来,保留一个指针或引用的变量,也不代表它指向的对象仍然有效。底层存储已被释放或者对象的使用条件已不再满足时,那个值仍可留在程序中,却不能继续按原来的对象访问。
生命周期标注描述关系
Rust使用生命周期参数说明引用有效期之间的约束。例如从两个字符串切片中返回一个的函数,需要让返回引用只在两个输入都满足所需条件的共同有效范围内使用,而不是凭函数内部选择就创造新的存储。
标注不会改变输入实际存活多久,也不会把已经结束的局部值救活。返回指向函数内部临时String的引用仍然无效;若要把该字符串交给调用者,通常应返回拥有它的值。
释放顺序也属于语言规则
Rust把局部变量与临时值关联到丢弃作用域,并规定离开作用域时相应的清理顺序;结构体字段与局部变量又有各自规则。不能只凭内存仍在某个地址,就忽略其所有者与析构行为。
自动清理也有明确边界。Rust允许显式阻止析构,并存在不展开调用栈的进程终止方式;这种情况下不能期待正常作用域退出的清理保证。对象有效访问、资源是否泄漏和程序如何终止,是需要分别考察的性质。