Struct core::mem::ManuallyDrop
1.20.0 · source · [−]#[repr(transparent)]pub struct ManuallyDrop<T: ?Sized> { /* private fields */ }Expand description
A wrapper to inhibit compiler from automatically calling T’s destructor.
This wrapper is 0-cost.
ManuallyDrop<T> is guaranteed to have the same layout as T, and is subject
to the same layout optimizations as T. As a consequence, it has no effect
on the assumptions that the compiler makes about its contents. For example,
initializing a ManuallyDrop<&mut T> with mem::zeroed is undefined
behavior. If you need to handle uninitialized data, use MaybeUninit<T>
instead.
Note that accessing the value inside a ManuallyDrop<T> is safe.
This means that a ManuallyDrop<T> whose content has been dropped must not
be exposed through a public safe API.
Correspondingly, ManuallyDrop::drop is unsafe.
ManuallyDrop and drop order.
Rust has a well-defined drop order of values. To make sure that fields or locals are dropped in a specific order, reorder the declarations such that the implicit drop order is the correct one.
It is possible to use ManuallyDrop to control the drop order, but this
requires unsafe code and is hard to do correctly in the presence of
unwinding.
For example, if you want to make sure that a specific field is dropped after the others, make it the last field of a struct:
struct Context;
struct Widget {
children: Vec<Widget>,
// `context` will be dropped after `children`.
// Rust guarantees that fields are dropped in the order of declaration.
context: Context,
}RunImplementations
impl<T> ManuallyDrop<T>
source
impl<T> ManuallyDrop<T>
sourcepub const fn new(value: T) -> ManuallyDrop<T>
const: 1.32.0 · source
pub const fn new(value: T) -> ManuallyDrop<T>
const: 1.32.0 · sourcepub const fn into_inner(slot: ManuallyDrop<T>) -> T
const: 1.32.0 · source
pub const fn into_inner(slot: ManuallyDrop<T>) -> T
const: 1.32.0 · sourcepub unsafe fn take(slot: &mut ManuallyDrop<T>) -> T
1.42.0 · source
pub unsafe fn take(slot: &mut ManuallyDrop<T>) -> T
1.42.0 · sourceTakes the value from the ManuallyDrop<T> container out.
This method is primarily intended for moving out values in drop.
Instead of using ManuallyDrop::drop to manually drop the value,
you can use this method to take the value and use it however desired.
Whenever possible, it is preferable to use into_inner
instead, which prevents duplicating the content of the ManuallyDrop<T>.
Safety
This function semantically moves out the contained value without preventing further usage,
leaving the state of this container unchanged.
It is your responsibility to ensure that this ManuallyDrop is not used again.
impl<T: ?Sized> ManuallyDrop<T>
source
impl<T: ?Sized> ManuallyDrop<T>
sourcepub unsafe fn drop(slot: &mut ManuallyDrop<T>)
source
pub unsafe fn drop(slot: &mut ManuallyDrop<T>)
sourceManually drops the contained value. This is exactly equivalent to calling
ptr::drop_in_place with a pointer to the contained value. As such, unless
the contained value is a packed struct, the destructor will be called in-place
without moving the value, and thus can be used to safely drop pinned data.
If you have ownership of the value, you can use ManuallyDrop::into_inner instead.
Safety
This function runs the destructor of the contained value. Other than changes made by
the destructor itself, the memory is left unchanged, and so as far as the compiler is
concerned still holds a bit-pattern which is valid for the type T.
However, this “zombie” value should not be exposed to safe code, and this function
should not be called more than once. To use a value after it’s been dropped, or drop
a value multiple times, can cause Undefined Behavior (depending on what drop does).
This is normally prevented by the type system, but users of ManuallyDrop must
uphold those guarantees without assistance from the compiler.
Trait Implementations
impl<T: Clone + ?Sized> Clone for ManuallyDrop<T>
source
impl<T: Clone + ?Sized> Clone for ManuallyDrop<T>
sourcefn clone(&self) -> ManuallyDrop<T>
source
fn clone(&self) -> ManuallyDrop<T>
sourceReturns a copy of the value. Read more
fn clone_from(&mut self, source: &Self)
1.0.0 · source
fn clone_from(&mut self, source: &Self)
1.0.0 · sourcePerforms copy-assignment from source. Read more
impl<T: Debug + ?Sized> Debug for ManuallyDrop<T>
source
impl<T: Debug + ?Sized> Debug for ManuallyDrop<T>
sourceimpl<T: Default + ?Sized> Default for ManuallyDrop<T>
source
impl<T: Default + ?Sized> Default for ManuallyDrop<T>
sourcefn default() -> ManuallyDrop<T>
source
fn default() -> ManuallyDrop<T>
sourceReturns the “default value” for a type. Read more
impl<T: ?Sized> Deref for ManuallyDrop<T>
const: unstable · source
impl<T: ?Sized> Deref for ManuallyDrop<T>
const: unstable · sourceimpl<T: ?Sized> DerefMut for ManuallyDrop<T>
const: unstable · source
impl<T: ?Sized> DerefMut for ManuallyDrop<T>
const: unstable · sourceimpl<T: Hash + ?Sized> Hash for ManuallyDrop<T>
source
impl<T: Hash + ?Sized> Hash for ManuallyDrop<T>
sourceimpl<T: Ord + ?Sized> Ord for ManuallyDrop<T>
source
impl<T: Ord + ?Sized> Ord for ManuallyDrop<T>
sourcefn cmp(&self, other: &ManuallyDrop<T>) -> Ordering
source
fn cmp(&self, other: &ManuallyDrop<T>) -> Ordering
sourcefn max(self, other: Self) -> Self where
Self: Sized,
1.21.0 · source
fn max(self, other: Self) -> Self where
Self: Sized,
1.21.0 · sourceCompares and returns the maximum of two values. Read more
impl<T: PartialEq + ?Sized> PartialEq<ManuallyDrop<T>> for ManuallyDrop<T>
source
impl<T: PartialEq + ?Sized> PartialEq<ManuallyDrop<T>> for ManuallyDrop<T>
sourcefn eq(&self, other: &ManuallyDrop<T>) -> bool
source
fn eq(&self, other: &ManuallyDrop<T>) -> bool
sourceThis method tests for self and other values to be equal, and is used
by ==. Read more
fn ne(&self, other: &ManuallyDrop<T>) -> bool
source
fn ne(&self, other: &ManuallyDrop<T>) -> bool
sourceThis method tests for !=.
impl<T: PartialOrd + ?Sized> PartialOrd<ManuallyDrop<T>> for ManuallyDrop<T>
source
impl<T: PartialOrd + ?Sized> PartialOrd<ManuallyDrop<T>> for ManuallyDrop<T>
sourcefn partial_cmp(&self, other: &ManuallyDrop<T>) -> Option<Ordering>
source
fn partial_cmp(&self, other: &ManuallyDrop<T>) -> Option<Ordering>
sourceThis method returns an ordering between self and other values if one exists. Read more
fn lt(&self, other: &Rhs) -> bool
1.0.0 · source
fn lt(&self, other: &Rhs) -> bool
1.0.0 · sourceThis method tests less than (for self and other) and is used by the < operator. Read more
fn le(&self, other: &Rhs) -> bool
1.0.0 · source
fn le(&self, other: &Rhs) -> bool
1.0.0 · sourceThis method tests less than or equal to (for self and other) and is used by the <=
operator. Read more
impl<T: Copy + ?Sized> Copy for ManuallyDrop<T>
sourceimpl<T: Eq + ?Sized> Eq for ManuallyDrop<T>
sourceimpl<T: ?Sized> StructuralEq for ManuallyDrop<T>
sourceimpl<T: ?Sized> StructuralPartialEq for ManuallyDrop<T>
sourceAuto Trait Implementations
impl<T: ?Sized> RefUnwindSafe for ManuallyDrop<T> where
T: RefUnwindSafe,
impl<T: ?Sized> Send for ManuallyDrop<T> where
T: Send,
impl<T: ?Sized> Sync for ManuallyDrop<T> where
T: Sync,
impl<T: ?Sized> Unpin for ManuallyDrop<T> where
T: Unpin,
impl<T: ?Sized> UnwindSafe for ManuallyDrop<T> where
T: UnwindSafe,
Blanket Implementations
impl<T> BorrowMut<T> for T where
T: ?Sized,
source
impl<T> BorrowMut<T> for T where
T: ?Sized,
sourcefn borrow_mut(&mut self) -> &mut T
const: unstable · source
fn borrow_mut(&mut self) -> &mut T
const: unstable · sourceMutably borrows from an owned value. Read more