41template <
class OwnerClass>
53 if (--(getCounter().numObjects) < 0)
55 DBG (
"*** Dangling pointer deletion! Class: " << getLeakedObjectClassName());
77 LeakCounter() =
default;
81 if (numObjects.value > 0)
83 DBG (
"*** Leaked objects detected: " << numObjects.value <<
" instance(s) of class " << getLeakedObjectClassName());
99 static const char* getLeakedObjectClassName()
101 return OwnerClass::getLeakedObjectClassName();
104 static LeakCounter& getCounter()
noexcept
106 static LeakCounter counter;
112#if DOXYGEN || ! defined (JUCE_LEAK_DETECTOR)
113 #if (DOXYGEN || JUCE_CHECK_MEMORY_LEAKS)
133 #define JUCE_LEAK_DETECTOR(OwnerClass) \
134 friend class juce::LeakedObjectDetector<OwnerClass>; \
135 static const char* getLeakedObjectClassName() noexcept { return #OwnerClass; } \
136 juce::LeakedObjectDetector<OwnerClass> JUCE_JOIN_MACRO (leakDetector, __LINE__);
138 #define JUCE_LEAK_DETECTOR(OwnerClass)