我们应该使用 Option 还是 ptr::null 来表示 Rust 中的空指针



标准库的链接列表Node使用Option类型:

struct Node<T> {
    next: Option<NonNull<Node<T>>>,
    prev: Option<NonNull<Node<T>>>,
    element: T,
}

并使用以下代码创建一个节点:

Node {
    next: None,
    prev: None,
    element,
}

BTree LeafNode的实现,标准库使用原始指针作为父节点:

struct LeafNode<K, V> {
    parent: *const InternalNode<K, V>,
    parent_idx: MaybeUninit<u16>,
    len: u16,
    keys: MaybeUninit<[K; CAPACITY]>,
    vals: MaybeUninit<[V; CAPACITY]>,
}

并通过将parent设置为 ptr::null 来创建新的叶节点:

LeafNode {
    keys: MaybeUninit::uninitialized(),
    vals: MaybeUninit::uninitialized(),
    parent: ptr::null(),
    parent_idx: MaybeUninit::uninitialized(),
    len: 0
}

我们可以用nullptr在C++中实现上面的代码,那么Optionstd::ptr::null()来表示空指针有什么区别呢?表示空指针的推荐方法是什么?

一般来说,我建议使用 NonNull<T> 而不是 *const T*mut T ,根据需要使用Option来识别指针何时可能为空。

原因有二:

  1. null 是否为有效值将在使用 NonNull记录并强制执行
  2. *const T*mut T基本上是可以互换的,而且确实可以相互叠加,因此constmut可能会提供虚假的安全感。

BTree 的实现可能根本没有移植到 NonNull 中,这是相对较新的 - 它仅在 1.25 中稳定下来。

相关内容

  • 没有找到相关文章

最新更新