DebugNew.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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, 9 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. template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
  70. T* bullet_new(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9)
  71. {
  72. #ifdef GAMEPLAY_MEM_LEAK_DETECTION
  73. #undef new
  74. T* t = new T(t1, t2, t3, t4, t5, t6, t7, t8, t9);
  75. #define new DEBUG_NEW
  76. return t;
  77. #else
  78. return new T(t1, t2, t3, t4, t5, t6, t7, t8, t9);
  79. #endif
  80. }
  81. #if defined(WIN32)
  82. /**
  83. * Sets whether stack traces are tracked on memory allocations or not.
  84. *
  85. * @param trackStackTrace Whether to track the stack trace on memory allocations.
  86. */
  87. void setTrackStackTrace(bool trackStackTrace);
  88. /**
  89. * Toggles stack trace tracking on memory allocations.
  90. */
  91. void toggleTrackStackTrace();
  92. #endif
  93. #endif