在下面的程序的第2行中分配了一个矢量资源。 程序结束时,不拥有矢量资源。如果资源根本不归属,那么它何时被回收?是否有使用Rust所有权语义和生命周期术语的解释可能说服程序员确实回收了这个资源?
fn main() {
let mut v = vec![1,2];
v = vec![3, 4];
}
答案 0 :(得分:7)
什么时候[无主资源]被收回?
在Rust术语中,当一个项目超出范围时被删除,这通常(但不总是)对应于块的结尾。删除时,也会释放属于该项目的所有资源。
资源可以表示内存,如向量示例中所示,但它也可以对应于其他内容,如文件句柄或锁。这通常称为资源获取初始化(RAII)。
说服程序员这个资源确实被回收了吗?
你永远无法说服那些真正不想相信的人^ _ ^。但是,您可以自己实施Drop
以查看项目何时被删除:
struct NoisyDrop(u8);
impl Drop for NoisyDrop {
fn drop(&mut self) {
println!("Number {} being dropped", self.0);
}
}
fn main() {
println!("step 1");
let mut nd = NoisyDrop(1);
println!("step 2");
nd = NoisyDrop(2);
println!("step 3");
}
这将有输出
step 1
step 2
Number 1 being dropped
step 3
Number 2 being dropped
您可以看到第一个变量在更换其绑定时被删除,因为不再有任何方法可以获得NoisyDrop(1)
值。由于方法结束,第二个变量在超出范围时被删除。
所有权语义和生命周期
考虑这个例子:
fn main() {
let mut v = vec![1];
v = vec![2];
}
从概念上讲,它可以写成
fn main() {
{
let v = vec![1];
}
{
v = vec![2];
}
}
这个例子
fn main() {
let v1 = vec![1];
let v2 = vec![2];
}
可以改写为
fn main() {
{
let v1 = vec![1];
{
let v2 = vec![2];
}
}
}
这些重写显示了每个变量的生命周期。每当使用泛型生存期参数调用方法时,块的生命周期将是替换'a
泛型的具体值。