mallocnull.rs 977 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. use core::mem;
  2. use libc::{c_void, size_t};
  3. /// Malloc memory if pointer is null, and free on drop
  4. pub struct MallocNull<T> {
  5. value: *mut T,
  6. free_on_drop: bool
  7. }
  8. impl<T> MallocNull<T> {
  9. pub fn new(ptr: *mut T, size: usize) -> MallocNull<T> {
  10. if ptr.is_null() {
  11. MallocNull {
  12. value: unsafe { ::malloc(size as size_t) as *mut T },
  13. free_on_drop: true
  14. }
  15. } else {
  16. MallocNull {
  17. value: ptr,
  18. free_on_drop: false
  19. }
  20. }
  21. }
  22. pub fn into_raw(self) -> *mut T {
  23. let ptr = self.value;
  24. mem::forget(self);
  25. ptr
  26. }
  27. pub fn as_ptr(&self) -> *const T {
  28. self.value
  29. }
  30. pub fn as_mut_ptr(&self) -> *mut T {
  31. self.value
  32. }
  33. }
  34. impl<T> Drop for MallocNull<T> {
  35. fn drop(&mut self) {
  36. if self.free_on_drop {
  37. unsafe { ::free(self.value as *mut c_void) };
  38. }
  39. }
  40. }