Why is drop called before end of scope?

Trying to get a printout at the end of the scope for a variable but the drop function is called when there i no more use of the variable

struct DropGuard(());

impl Drop for DropGuard {
    fn drop(&mut self) {
        println!("from drop");
    }
}

fn main() {
    {
        let _ = DropGuard(());
        println!("from scope");
    }
    println!("from outside of scope");
}

this give the printout:
from drop
from scope
from outside of scope

but I want:
from scope
from drop
from outside of scope

is this possible?

1 Like

With let _ = you're not actually creating a binding for the DropGuard value, so the value only lives until the end of the expression. To create a binding, you need to give it a name, for example:

fn main() {
    {
        let _guard = DropGuard(());
        println!("from scope");
    }
    println!("from outside of scope");
}
2 Likes

that did it, thanks for the help have been trying to figure it out all day

Implementing the following macro I had to ensure a data-element is put onto stack of main-function and not removed until leaving the scope. The asm-expression was necessary to prevent it is optimized-out creating a release-build.
https://github.com/frehberg/rust-releasetag/blob/master/src/lib.rs

Rust (nightly) supports also the "#[used]" annotation to prevent the data is removed by optimizer
https://doc.rust-lang.org/unstable-book/language-features/used.html

1 Like