Trait sgx_tstd::ops::Drop 1.0.0[−][src]
#[lang = "drop"]pub trait Drop { fn drop(&mut self); }
Used to run some code when a value goes out of scope. This is sometimes called a 'destructor'.
When a value goes out of scope, it will have its drop method called if
its type implements Drop. Then, any fields the value contains will also
be dropped recursively.
Because of this recursive dropping, you do not need to implement this trait unless your type needs its own destructor logic.
Refer to the chapter on Drop in The Rust Programming Language
for some more elaboration.
Examples
Implementing Drop
The drop method is called when _x goes out of scope, and therefore
main prints Dropping!.
struct HasDrop; impl Drop for HasDrop { fn drop(&mut self) { println!("Dropping!"); } } fn main() { let _x = HasDrop; }
Dropping is done recursively
When outer goes out of scope, the drop method will be called first for
Outer, then for Inner. Therefore, main prints Dropping Outer! and
then Dropping Inner!.
struct Inner; struct Outer(Inner); impl Drop for Inner { fn drop(&mut self) { println!("Dropping Inner!"); } } impl Drop for Outer { fn drop(&mut self) { println!("Dropping Outer!"); } } fn main() { let _x = Outer(Inner); }
Variables are dropped in reverse order of declaration
_first is declared first and _second is declared second, so main will
print Declared second! and then Declared first!.
struct PrintOnDrop(&'static str); impl Drop for PrintOnDrop { fn drop(&mut self) { println!("{}", self.0); } } fn main() { let _first = PrintOnDrop("Declared first!"); let _second = PrintOnDrop("Declared second!"); }
Required Methods
fn drop(&mut self)
Executes the destructor for this type.
This method is called implicitly when the value goes out of scope,
and cannot be called explicitly (this is compiler error E0040).
However, the std::mem::drop function in the prelude can be
used to call the argument's Drop implementation.
When this method has been called, self has not yet been deallocated.
That only happens after the method is over.
If this wasn't the case, self would be a dangling reference.
Panics
Given that a panic! will call drop as it unwinds, any panic!
in a drop implementation will likely abort.
Implementations on Foreign Types
impl<'a, T> Drop for LocalFutureObj<'a, T>[src]
impl<'a, T> Drop for LocalFutureObj<'a, T>impl Drop for Waker[src]
impl Drop for Wakerimpl Drop for LocalWaker[src]
impl Drop for LocalWakerimpl Drop for SgxFileStream[src]
impl Drop for SgxFileStreamImplementors
impl<K, V> Drop for BTreeMap<K, V>impl<T> Drop for Vec<T>impl<T> Drop for Arc<T> where
T: ?Sized,impl<K, V> Drop for sgx_tstd::collections::btree_map::IntoIter<K, V>impl<T> Drop for VecDeque<T>impl<'a, T, F> Drop for sgx_tstd::collections::linked_list::DrainFilter<'a, T, F> where
F: FnMut(&mut T) -> bool,impl<T> Drop for sgx_tstd::rc::Weak<T> where
T: ?Sized,impl<'a, T> Drop for PeekMut<'a, T> where
T: Ord,impl<T> Drop for Box<T> where
T: ?Sized,impl<'a, T, F> Drop for sgx_tstd::vec::DrainFilter<'a, T, F> where
F: FnMut(&mut T) -> bool,impl<T> Drop for Rc<T> where
T: ?Sized,impl<'a, T> Drop for sgx_tstd::collections::vec_deque::Drain<'a, T> where
T: 'a,impl<T> Drop for LinkedList<T>impl<'a, T> Drop for sgx_tstd::vec::Drain<'a, T>impl<'a, I> Drop for Splice<'a, I> where
I: Iterator,impl<T> Drop for sgx_tstd::sync::Weak<T> where
T: ?Sized,impl<'a> Drop for sgx_tstd::string::Drain<'a>impl<T> Drop for sgx_tstd::vec::IntoIter<T>impl Drop for CStringimpl<W: Write> Drop for BufWriter<W>impl Drop for SgxCondvarimpl<T: ?Sized> Drop for SgxMutex<T>impl<'a, T: ?Sized> Drop for SgxMutexGuard<'a, T>impl<T> Drop for SgxReentrantMutex<T>impl<'a, T> Drop for SgxReentrantMutexGuard<'a, T>impl<T: ?Sized> Drop for SgxRwLock<T>impl<'a, T: ?Sized> Drop for SgxRwLockReadGuard<'a, T>impl<'a, T: ?Sized> Drop for SgxRwLockWriteGuard<'a, T>impl<'a> Drop for SgxSpinlockGuard<'a>