41template <
class OwnerClass>
51 if (--(getCounter().numObjects) < 0)
53 DBG (
"*** Dangling pointer deletion! Class: " << getLeakedObjectClassName());
75 LeakCounter() =
default;
79 if (numObjects.value > 0)
81 DBG (
"*** Leaked objects detected: " << numObjects.value <<
" instance(s) of class " << getLeakedObjectClassName());
97 static const char* getLeakedObjectClassName()
99 return OwnerClass::getLeakedObjectClassName();
102 static LeakCounter& getCounter()
noexcept
104 static LeakCounter counter;
110#if DOXYGEN || ! defined (JUCE_LEAK_DETECTOR)
111 #if (DOXYGEN || JUCE_CHECK_MEMORY_LEAKS)
131 #define JUCE_LEAK_DETECTOR(OwnerClass) \
132 friend class juce::LeakedObjectDetector<OwnerClass>; \
133 static const char* getLeakedObjectClassName() noexcept { return #OwnerClass; } \
134 juce::LeakedObjectDetector<OwnerClass> JUCE_JOIN_MACRO (leakDetector, __LINE__);
136 #define JUCE_LEAK_DETECTOR(OwnerClass)