当我用引用而不是拥有的值调用std :: mem :: drop时会发生什么?

时间:2019-03-23 13:52:50

标签: reference rust raii

fn main(){
    let k = "fire";

    drop(k);

    println!("{:?}", k);
}

Playground

为什么k删除后仍然可以使用? drop是否不会自动取消引用参考?如果是,那为什么呢?对于Drop&str的实现是什么样的?

1 个答案:

答案 0 :(得分:4)

  

当我通过引用呼叫std::mem::drop时会发生什么

引用本身已删除。

  

引用而不是拥有的值

引用一个值。

  

为什么k删除后仍然可以使用?

因为不可变的指针实现了Copy。您传入参考的副本并将其删除。

  

drop不会自动取消引用吗?

不,不是。

  

Drop的{​​{1}}实施情况如何?

没有任何一种引用是不变的或可变的,所以它是有效的 1

&str

另请参阅:


1 —与Peter Hall points out一样,有一个空的impl Drop for &str { fn drop(&mut self) {} } 实现和没有用户提供的Drop实现之间有区别,但是出于目的这个问题,它们是相同的。