45 template <
class OwnerClass>
55 if (--(getCounter().numObjects) < 0)
57 DBG (
"*** Dangling pointer deletion! Class: " << getLeakedObjectClassName());
79 LeakCounter() =
default;
83 if (numObjects.value > 0)
85 DBG (
"*** Leaked objects detected: " << numObjects.value <<
" instance(s) of class " << getLeakedObjectClassName());
98 Atomic<int> numObjects;
101 static const char* getLeakedObjectClassName()
103 return OwnerClass::getLeakedObjectClassName();
106 static LeakCounter& getCounter() noexcept
108 static LeakCounter counter;
114 #if DOXYGEN || ! defined (JUCE_LEAK_DETECTOR)
115 #if (DOXYGEN || JUCE_CHECK_MEMORY_LEAKS)
135 #define JUCE_LEAK_DETECTOR(OwnerClass) \
136 friend class juce::LeakedObjectDetector<OwnerClass>; \
137 static const char* getLeakedObjectClassName() noexcept { return #OwnerClass; } \
138 juce::LeakedObjectDetector<OwnerClass> JUCE_JOIN_MACRO (leakDetector, __LINE__);
140 #define JUCE_LEAK_DETECTOR(OwnerClass)
Embedding an instance of this class inside another class can be used as a low-overhead way of detecti...