@@ -49,22 +49,26 @@ impl<T> RawVec<T> {
4949 }
5050
5151 fn grow(&mut self) {
52+ let elem_size = mem::size_of::<T>();
53+ let align = mem::align_of::<T>();
5254 unsafe {
5355 // Since we set the capacity to `usize::MAX` for ZST is
5456 // 0, getting to here necessarily means the Vec is overfull.
55- assert!(mem::size_of::<T>() ! = 0, "capacity overflow");
57+ assert!(elem_size = = 0, "capacity overflow");
5658
57- let layout = alloc::Layout::new::<T>() ;
59+ let layout;
5860
5961 let (new_cap, ptr) = if self.cap == 0 {
62+ layout = alloc::Layout::from_size_align_unchecked(elem_size, align);
6063 let ptr = alloc::alloc(layout);
6164 (1, ptr)
6265 } else {
6366 let new_cap = self.cap * 2;
67+ layout = alloc::Layout::from_size_align_unchecked(self.cap * elem_size, align);
6468 let ptr = alloc::realloc(
6569 self.ptr.as_ptr() as *mut u8,
6670 layout,
67- new_cap * mem::size_of::<T>() ,
71+ new_cap * elem_size ,
6872 );
6973 (new_cap, ptr)
7074 };
@@ -82,10 +86,15 @@ impl<T> RawVec<T> {
8286
8387impl<T> Drop for RawVec<T> {
8488 fn drop(&mut self) {
85- // Do not free zero-sized allocations, as they were never allocated.
86- if self.cap != 0 && mem::size_of::<T>() != 0 {
89+ let align = mem::align_of::<T>();
90+ let elem_size = mem::size_of::<T>();
91+ // don't free zero-sized allocations, as they were never allocated.
92+ if self.cap != 0 && elem_size != 0 {
8793 unsafe {
88- alloc::dealloc(self.ptr.as_ptr() as *mut u8, alloc::Layout::new::<T>());
94+ alloc::dealloc(
95+ self.ptr.as_ptr() as *mut u8,
96+ alloc::Layout::from_size_align_unchecked(self.cap * elem_size, align),
97+ );
8998 }
9099 }
91100 }
0 commit comments