Метод dangling
Метод dangling класса NonNull создаёт
висячий указатель, который указывает на выровненный
адрес в памяти, но не ссылается на реально существующие
данные. Такой указатель нельзя разыменовывать, но можно
использовать для создания структур, которым требуется
ненулевой указатель для обозначения отсутствия данных,
например в связных списках или деревьях. Параметров
метод не принимает.
Синтаксис
NonNull::<T>::dangling()
Пример
Давайте создадим висячий указатель на тип i32
и проверим его адрес:
use std::ptr::NonNull;
fn main()
{
let ptr: NonNull<i32> = NonNull::dangling();
println!("{:?}", ptr);
println!("{}", ptr.as_ptr() as usize);
}
Результат выполнения кода:
0x4
Пример
Давайте убедимся, что висячий указатель выровнен
по границе типа u64:
use std::ptr::NonNull;
use std::mem::align_of;
fn main()
{
let ptr: NonNull<u64> = NonNull::dangling();
let addr = ptr.as_ptr() as usize;
println!("{}", addr % align_of::<u64>() == 0);
}
Результат выполнения кода:
true
Пример
Давайте используем висячий указатель для создания безопасного представления пустого связного списка:
use std::ptr::NonNull;
struct Node
{
value: i32,
next: Option<NonNull<Node>>,
}
fn main()
{
let sentinel: NonNull<Node> = NonNull::dangling();
let empty: Option<NonNull<Node>> = None;
println!("{:?}", sentinel);
println!("{:?}", empty);
}
Результат выполнения кода:
0x4
None