标准库的链表Node
uses the Option
type :
struct Node<T> {
next: Option<NonNull<Node<T>>>,
prev: Option<NonNull<Node<T>>>,
element: T,
}
并使用此代码创建一个节点:
Node {
next: None,
prev: None,
element,
}
执行LeafNode
的 BTree
, 标准库 uses a raw pointer for the parent node :
struct LeafNode<K, V> {
parent: *const InternalNode<K, V>,
parent_idx: MaybeUninit<u16>,
len: u16,
keys: MaybeUninit<[K; CAPACITY]>,
vals: MaybeUninit<[V; CAPACITY]>,
}
并创建新的叶节点by setting parent
to ptr::null
:
LeafNode {
keys: MaybeUninit::uninitialized(),
vals: MaybeUninit::uninitialized(),
parent: ptr::null(),
parent_idx: MaybeUninit::uninitialized(),
len: 0
}
我们可以使用nullptr
在 C++ 中实现上述代码,那么 Option
之间有什么区别?和 std::ptr::null()
代表一个空指针?表示空指针的推荐方法是什么?
最佳答案
一般来说,我建议使用 NonNull<T>
在 *const T
或 *mut T
, 使用 Option
适本地识别指针何时可能为空。
原因有两个:
- 在使用
NonNull
时,记录并强制执行 null 是否为有效值| . -
*const T
和*mut T
本质上是可以互换的,并且确实可以相互转换,因此const
或mut
可能会提供一种错误的安全感。
执行BTree
可能根本没有移植到 NonNull
,这是相对较新的 -- 它仅在 1.25 中稳定下来。
关于null - 我们应该使用 Option 还是 ptr::null 来表示 Rust 中的空指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54195517/