From c80a85ba27394e3b0660765c75b00a6e01b8406f Mon Sep 17 00:00:00 2001 From: Fedor Gogolev Date: Sat, 22 Sep 2018 13:10:32 +0300 Subject: [PATCH] feat: handle zero sized types --- src/lib.rs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 9e6c7bd..68df3f7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -244,12 +244,14 @@ impl Drop for Buffer { // since this is the destructor, there shouldn't be any contention... so meh? while let Some(_) = self.try_pop() {} - unsafe { - let layout = Layout::from_size_align( - self.allocated_size * mem::size_of::(), - mem::align_of::(), - ).unwrap(); - alloc::dealloc(self.buffer as *mut u8, layout); + if mem::size_of::() > 0 { + unsafe { + let layout = Layout::from_size_align( + self.allocated_size * mem::size_of::(), + mem::align_of::(), + ).unwrap(); + alloc::dealloc(self.buffer as *mut u8, layout); + } } } } @@ -342,11 +344,17 @@ unsafe fn allocate_buffer(capacity: usize) -> *mut T { .expect("capacity overflow"); let layout = Layout::from_size_align(size, mem::align_of::()).unwrap(); - let ptr = alloc::alloc(layout); + + let ptr = if size > 0 { + alloc::alloc(layout) as *mut T + } else { + mem::align_of::() as *mut T + }; + if ptr.is_null() { alloc::handle_alloc_error(layout) } else { - ptr as *mut T + ptr } }