Unique
这个类型目前还是 unstable
状态, 但它已被标准库大量使用.
Unique<T>
是对 *mut T
原始指针的包装, 但前者在逻辑上拥有指针指向的对象的所有权.
Unique
结构体的定义是:
#[repr(transparent)]
pub struct Unique<T: ?Sized> {
pointer: NonNull<T>,
_marker: PhantomData<T>,
}
如果 T
实现了 Send
trait 和 Sync
trait, 则 Unique<T>
也实现它:
unsafe impl<T: Send + ?Sized> Send for Unique<T> {}
unsafe impl<T: Sync + ?Sized> Sync for Unique<T> {}
常用方法
new()
,new_unchecked()
, 创建新的Unique
对象as_ptr()
得到*mut T
指针as_ref()
得到只读引用as_mut()
得到可变更引用
#![allow(internal_features)] #![feature(ptr_internals)] use std::ptr::Unique; fn main() { let mut x = 1_u32; let mut ptr = Unique::new(&mut x as *mut u32).expect("Invalid pointer"); unsafe { *ptr.as_ptr() += 1; } let x_value = unsafe { *ptr.as_ptr() }; assert_eq!(x_value, 2); assert_eq!(x, 2); let x_ref = unsafe { ptr.as_mut() }; *x_ref += 1; assert_eq!(x, 3); }