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

sn9*_*n99 6 reference raii rust

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

    drop(k);

    println!("{:?}", k);
}
Run Code Online (Sandbox Code Playgroud)

操场

k为什么我丢了之后还能用?不会drop自动解除引用吗?如果是,那为什么?的实现是什么Drop样的&str

She*_*ter 9

\n

std::mem::drop当我打电话给推荐人时会发生什么

\n
\n\n

引用本身被删除。

\n\n
\n

参考而不是拥有的价值

\n
\n\n

参考就是一个值。

\n\n
\n

k为什么我丢了之后还能用?

\n
\n\n

因为不可变指针实现了Copy. 您传入引用的副本,然后它就会被删除。

\n\n
\n

不会drop自动解除引用吗?

\n
\n\n

不,不是的。

\n\n
\n

的实现是什么Drop样的&str

\n
\n\n

没有一个可以用于任何类型的引用,无论是不可变的还是可变的,因此它实际上是 1

\n\n
impl Drop for &str {\n    fn drop(&mut self) {}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

也可以看看:

\n\n\n\n
\n\n

1 \xe2\x80\x94 正如Peter Hall 指出的Drop那样,空实现和没有用户提供的实现之间存在差异,但就这个Drop问题而言,它们是相同的。

\n

  • _“所以它是有效的:...”_ — 拥有 `Drop` impl 的事实具有其他含义,所以这并不完全正确.. (3认同)