问题
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?
回答1:
What happens when I call
std::mem::dropwith 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
kafter dropping it?
Because immutable pointers implement Copy. You pass in a copy of the reference and it's dropped.
Does
dropnot deref a reference automatically?
No, it does not.
what does the implementation of
Droplook 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.
来源:https://stackoverflow.com/questions/55314407/what-happens-when-i-call-stdmemdrop-with-a-reference-instead-of-an-owned-val