Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What happens when I call std::mem::drop with a reference instead of an owned value?

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

    drop(k);

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

Playground

Why am I still able to use k after dropping it? Does drop not deref a reference automatically? If yes, then why? What does the implementation of Drop look like for &str?

like image 840
sn99 Avatar asked Mar 05 '23 07:03

sn99


1 Answers

What happens when I call std::mem::drop with a reference

The reference itself is dropped.

a reference instead of an owned value

A reference is a value.

Why am I still able to use k after dropping it?

Because immutable pointers implement Copy. You pass in a copy of the reference and it's dropped.

Does drop not deref a reference automatically?

No, it does not.

what does the implementation of Drop look like for &str?

There isn't one for any kind of reference, immutable or mutable, so it's effectively 1:

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

See also:

  • Moved variable still borrowing after calling `drop`?
  • Why does a mutable reference to a dropped object still count as a mutable reference?

1 — As Peter Hall points out, there is a difference between having an empty Drop implementation and having no user-provided Drop implementation, but for the purposes of this question they are the same.

like image 58
Shepmaster Avatar answered May 09 '23 00:05

Shepmaster