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

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

    drop(k);

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

Playground

为什么在丢弃引用之后仍然能够使用kdrop是否不会自动取消对引用的引用?如果是,为什么?&strDrop实现是什么样子的?

1个回答

9

如果我用引用调用std::mem::drop会发生什么?

引用本身会被丢弃。

相较于拥有值,使用引用会发生什么?

引用就是一个值。

为什么在丢弃 k 后我仍然能使用它?

因为不可变指针实现了Copy。你传递的是引用的副本,它被丢弃。

drop 不会自动解除引用吗?

不会。

&strDrop实现是什么样子的?

对于任何一种类型的引用(包括不可变和可变),都不存在Drop实现,因此1实际上没有这个方法:

impl Drop for &str {
    fn drop(&mut self) {}
}

参见:


1 — 正如Peter Hall所指出的那样,拥有空的Drop实现和没有用户提供的Drop实现之间存在差异,但对于问题,它们是相同的。


3
“因此实际上是这样的:…”——仅仅拥有Drop实现的事实就具有其他含义,因此这并不完全正确。 - Peter Hall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接