DebugNew.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #ifndef DEBUGNEW_H_
  2. #define DEBUGNEW_H_
  3. /**
  4. * Global overrides of the new and delete operators for memory tracking.
  5. * This file is only included when memory leak detection is explicitly
  6. * request via the pre-processor definition GAMEPLAY_MEM_LEAK_DETECTION.
  7. */
  8. #ifdef GAMEPLAY_MEM_LEAK_DETECTION
  9. #include <new>
  10. #include <exception>
  11. // Prints all heap and reference leaks to stderr.
  12. extern void printMemoryLeaks();
  13. // global new/delete operator overloads
  14. #ifdef _MSC_VER
  15. #pragma warning( disable : 4290 ) // C++ exception specification ignored.
  16. #endif
  17. void* operator new (std::size_t size, const char* file, int line);
  18. void* operator new[] (std::size_t size, const char* file, int line);
  19. void* operator new (std::size_t size) throw(std::bad_alloc);
  20. void* operator new[] (std::size_t size) throw(std::bad_alloc);
  21. void* operator new (std::size_t size, const std::nothrow_t&) throw();
  22. void* operator new[] (std::size_t size, const std::nothrow_t&) throw();
  23. void operator delete (void* p) throw();
  24. void operator delete[] (void* p) throw();
  25. void operator delete (void* p, const char* file, int line) throw();
  26. void operator delete[] (void* p, const char* file, int line) throw();
  27. #ifdef _MSC_VER
  28. #pragma warning( default : 4290 )
  29. #endif
  30. // Re-define new to use versions with file and line number
  31. #define DEBUG_NEW new (__FILE__, __LINE__)
  32. #define new DEBUG_NEW
  33. #endif
  34. // Since Bullet overrides new, we define custom functions to allocate Bullet objects that undef
  35. // 'new' before allocation and redefine it to our custom version afterwards (we support 0-2 parameter constructors).
  36. template<typename T> T* bullet_new()
  37. {
  38. #ifdef GAMEPLAY_MEM_LEAK_DETECTION
  39. #undef new
  40. T* t = new T();
  41. #define new DEBUG_NEW
  42. return t;
  43. #else
  44. return new T();
  45. #endif
  46. }
  47. template<typename T, typename T1> T* bullet_new(T1 t1)
  48. {
  49. #ifdef GAMEPLAY_MEM_LEAK_DETECTION
  50. #undef new
  51. T* t = new T(t1);
  52. #define new DEBUG_NEW
  53. return t;
  54. #else
  55. return new T(t1);
  56. #endif
  57. }
  58. template<typename T, typename T1, typename T2> T* bullet_new(T1 t1, T2 t2)
  59. {
  60. #ifdef GAMEPLAY_MEM_LEAK_DETECTION
  61. #undef new
  62. T* t = new T(t1, t2);
  63. #define new DEBUG_NEW
  64. return t;
  65. #else
  66. return new T(t1, t2);
  67. #endif
  68. }
  69. #endif