diff --git a/src/vec-zsts.md b/src/vec-zsts.md index aa492ac..f8a95d2 100644 --- a/src/vec-zsts.md +++ b/src/vec-zsts.md @@ -49,22 +49,26 @@ impl RawVec { } fn grow(&mut self) { + let elem_size = mem::size_of::(); + let align = mem::align_of::(); unsafe { // Since we set the capacity to `usize::MAX` for ZST is // 0, getting to here necessarily means the Vec is overfull. - assert!(mem::size_of::() != 0, "capacity overflow"); + assert!(elem_size == 0, "capacity overflow"); - let layout = alloc::Layout::new::(); + let layout; let (new_cap, ptr) = if self.cap == 0 { + layout = alloc::Layout::from_size_align_unchecked(elem_size, align); let ptr = alloc::alloc(layout); (1, ptr) } else { let new_cap = self.cap * 2; + layout = alloc::Layout::from_size_align_unchecked(self.cap * elem_size, align); let ptr = alloc::realloc( self.ptr.as_ptr() as *mut u8, layout, - new_cap * mem::size_of::(), + new_cap * elem_size, ); (new_cap, ptr) }; @@ -82,10 +86,15 @@ impl RawVec { impl Drop for RawVec { fn drop(&mut self) { - // Do not free zero-sized allocations, as they were never allocated. - if self.cap != 0 && mem::size_of::() != 0 { + let align = mem::align_of::(); + let elem_size = mem::size_of::(); + // don't free zero-sized allocations, as they were never allocated. + if self.cap != 0 && elem_size != 0 { unsafe { - alloc::dealloc(self.ptr.as_ptr() as *mut u8, alloc::Layout::new::()); + alloc::dealloc( + self.ptr.as_ptr() as *mut u8, + alloc::Layout::from_size_align_unchecked(self.cap * elem_size, align), + ); } } }