РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1189 of 1245 menu

Тип 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,
    который представляет неинициализированное значение
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить