https://docs.rs/safe-manually-drop
A type-level-based (rather than macro-based) equivalent to #1362168564710117476 message: a convenience wrapper type —and trait!— to expose owned access to a field when customizing the drop glue of your type.
#![forbid(unsafe_code)]
use ::safe_manually_drop::{DropManually, SafeManuallyDrop};
struct Defer<F: FnOnce()>(
SafeManuallyDrop<F, Self>,
);
/// No `unsafe`, no `.unwrap()`s, no macros.
impl<F: FnOnce()> DropManually<F> for Defer<F> {
fn drop_manually(f: F) {
f();
}
}
There is a whole dedicated section in the docs which is blog-post worthy, about Drop::drop() vs. mem::drop() vs. ptr::drop_in_place() 
