checked_delete.hpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //
  2. // "$Id$"
  3. //
  4. // Copyright (c)1992-2011, ZheJiang Dahua Technology Stock CO.LTD.
  5. // All Rights Reserved.
  6. //
  7. // Description:
  8. // Revisions: Year-Month-Day SVN-Author Modification
  9. //
  10. /// \file Infra/Detail/checked_delete.hpp
  11. /// 从 boost/checked_delete.hpp 移植过来带完整类型判断的 delete 操作函数
  12. ///
  13. #ifndef INFRA_DETAIL_CHECKED_DELETE_H__
  14. #define INFRA_DETAIL_CHECKED_DELETE_H__
  15. #include <cassert>
  16. #include <memory>
  17. namespace Dahua {
  18. namespace Memory {
  19. namespace Detail {
  20. // verify that types are complete for increased safety
  21. template<class T> inline void checked_delete(T * x)
  22. {
  23. // intentionally complex - simplification causes regressions
  24. typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
  25. (void) sizeof(type_must_be_complete);
  26. delete x;
  27. }
  28. template<class T> inline void checked_array_delete(T * x)
  29. {
  30. typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
  31. (void) sizeof(type_must_be_complete);
  32. delete [] x;
  33. }
  34. template<class T> struct checked_deleter
  35. {
  36. typedef void result_type;
  37. typedef T * argument_type;
  38. void operator()(T * x) const
  39. {
  40. // Dahua::Utils::Detail:: disables ADL
  41. Dahua::Memory::Detail::checked_delete(x);
  42. }
  43. };
  44. template<class T> struct checked_array_deleter
  45. {
  46. typedef void result_type;
  47. typedef T * argument_type;
  48. void operator()(T * x) const
  49. {
  50. Dahua::Memory::Detail::checked_array_delete(x);
  51. }
  52. };
  53. } // namespace Detail
  54. } // namespace Memory
  55. } // namespace Dahua
  56. #endif // INFRA_DETAIL_CHECKED_DELETE_H__