Struct core::cell::UnsafeCell
[−]
[src]
pub struct UnsafeCell<T: ?Sized> {
pub value: T,
}The core primitive for interior mutability in Rust.
UnsafeCell<T> is a type that wraps some T and indicates unsafe interior operations on the
wrapped type. Types with an UnsafeCell<T> field are considered to have an 'unsafe interior'.
The UnsafeCell<T> type is the only legal way to obtain aliasable data that is considered
mutable. In general, transmuting an &T type into an &mut T is considered undefined behavior.
Types like Cell<T> and RefCell<T> use this type to wrap their internal data.
Examples
fn main() { use std::cell::UnsafeCell; use std::marker::Sync; struct NotThreadSafe<T> { value: UnsafeCell<T>, } unsafe impl<T> Sync for NotThreadSafe<T> {} }use std::cell::UnsafeCell; use std::marker::Sync; struct NotThreadSafe<T> { value: UnsafeCell<T>, } unsafe impl<T> Sync for NotThreadSafe<T> {}
NOTE: UnsafeCell<T>'s fields are public to allow static initializers. It is not
recommended to access its fields directly, get should be used instead.
Fields
value | Unstable Wrapped value This field should not be accessed directly, it is made public for static initializers. |
Methods
impl<T> UnsafeCell<T>
const fn new(value: T) -> UnsafeCell<T>
Constructs a new instance of UnsafeCell which will wrap the specified
value.
All access to the inner value through methods is unsafe, and it is highly discouraged to
access the fields directly.
Examples
fn main() { use std::cell::UnsafeCell; let uc = UnsafeCell::new(5); }use std::cell::UnsafeCell; let uc = UnsafeCell::new(5);
unsafe fn into_inner(self) -> T
Unwraps the value.
Unsafety
This function is unsafe because this thread or another thread may currently be inspecting the inner value.
Examples
fn main() { use std::cell::UnsafeCell; let uc = UnsafeCell::new(5); let five = unsafe { uc.into_inner() }; }use std::cell::UnsafeCell; let uc = UnsafeCell::new(5); let five = unsafe { uc.into_inner() };
impl<T: ?Sized> UnsafeCell<T>
fn get(&self) -> *mut T
Gets a mutable pointer to the wrapped value.
Examples
fn main() { use std::cell::UnsafeCell; let uc = UnsafeCell::new(5); let five = uc.get(); }use std::cell::UnsafeCell; let uc = UnsafeCell::new(5); let five = uc.get();