fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>;
unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout);
来自https://doc.rust-lang.org/std/alloc/trait.Allocator.html
我还注意到,相比之下,GlobalAlloc*mut u8
一致使用https://doc.rust-lang.org/std/alloc/trait.GlobalAlloc.html
unsafe fn alloc(&self, layout: Layout) -> *mut u8;
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout);
请注意,该代码的最终形式尚未确定,并且可能会发生变化。
deallocate()
需要NonNull<u8>
因为要释放内存你不需要更多。只有指向分配开始的指针。但对于
allocate()
,分配器可能会由于各种原因而过度分配。当他们这样做时,最好通知用户他们超额分配以及超额分配的数量。例如,Vec
如果内存无论如何都可用,则 a 可能会使用此信息来增长比最初想要的更多。这就是
allocate()
返回 的原因NonNull<[u8]>
,以通知调用者分配的实际大小是多少。