Тип NonNull
Тип NonNull - это обёртка над сырым указателем,
которая гарантирует, что значение указателя никогда не равно
нулю. Это позволяет компилятору применять оптимизацию
«null pointer optimization» для таких типов, как
Option<NonNull<T>>, который занимает столько же
памяти, сколько и сам указатель. Тип является
unsafe-абстракцией: его создание и разыменование
требуют осторожности, а методы as_ref и
as_mut помечены как unsafe, поскольку
программист обязан гарантировать корректность указателя.
Параметром тип принимает тип данных T, на который
будет указывать ненулевой указатель.
Синтаксис
std::ptr::NonNull::<T>::new(ptr)
std::ptr::NonNull::<T>::dangling()
Пример
Давайте создадим NonNull из изменяемой ссылки
и получим значение через as_ref:
use std::ptr::NonNull;
fn main()
{
let mut value = 42;
let ptr = NonNull::from(&mut value);
unsafe {
let res = *ptr.as_ref();
println!("{}", res);
}
}
Результат выполнения кода:
42
Пример
Давайте создадим NonNull через метод
new и проверим, что указатель не нулевой:
use std::ptr::NonNull;
fn main()
{
let mut value = 12345;
let ptr = NonNull::new(&mut value as *mut i32);
match ptr {
Some(p) => {
unsafe {
let res = *p.as_ptr();
println!("{}", res);
}
},
None => println!("null pointer"),
}
}
Результат выполнения кода:
12345
Пример
Давайте получим «висячий» указатель с помощью метода
dangling, который не равен нулю, но не должен
разыменовываться:
use std::ptr::NonNull;
fn main()
{
let ptr: NonNull<i32> = NonNull::dangling();
let res = ptr.as_ptr();
println!("{:?}", res);
}
Результат выполнения кода:
0x4
Смотрите также
-
метод
dangling,
который создаёт ненулевой, но невалидный указатель -
метод
as_ptr,
который возвращает сырой указатель из NonNull -
метод
as_ref,
который возвращает ссылку из NonNull -
тип
MaybeUninit,
который представляет неинициализированное значение