fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>;
unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout);
de https://doc.rust-lang.org/std/alloc/trait.Allocator.html
Observo também que, em contraste, GlobalAlloc usa *mut u8
consistentemente 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);
Observe que ainda não está decidido qual será o formato final deste código, e ele pode mudar.
deallocate()
demoraNonNull<u8>
porque para desalocar memória você não precisa de mais do que isso. Somente aquele ponteiro para o início da alocação.Mas para
allocate()
, os alocadores podem alocar em excesso por vários motivos. Quando fizerem isso, será bom informar ao usuário que eles alocaram demais e quanto. Por exemplo, umVec
pode usar essas informações para crescer mais do que inicialmente desejava, se a memória estiver disponível de qualquer maneira.É por isso
allocate()
que retornaNonNull<[u8]>
, para informar ao chamador qual é o tamanho real da alocação.