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);
}