Hello,
We have integrated the Visual Leak Detector into our project and it has detected memory leaks that appear to be juce related. I have spent a bit of time looking into them, and it looks like the cause might be that inside the juce_dll, destructors for static and global variable sare not called.
I have done the following experiments. I created a simple struct that has a constructor and destructor and create an object of this type. I then put breakpoints in the constructor and destructor and see when they are called.
struct jucetest
{
    int        blah;
    jucetest()
    {
        blah = 2;
    }
    ~jucetest()
    {
        blah = 0;
    }
};
jucetest foobar;
If I put this at the bottom of say juce_win32_Threads.cpp, I will see the constructor run at program startup, but the destructor does not run at program shutdown
If I put an analogous bit of code in the bottom of our main.cpp file, I will see that the constructor is called at program startup and the destructor is called at program shutdown.
I believe that this might be related to how DLLs are loaded an unloaded, but I am not sure. I recall reading about how destructors may not be called if abort() is called as opposed to exit() and I think there might be analogous issues for DLLs. These issues might not be that serious as I think they only happen on program shutdown, but they may mask other memory leaks we get in the future.
Any insight would be appreciated.
Thanks,
John Lawrie
Here are a few of the memory leaks detected by the Visaul Leak Detector
---------- Block 6466 at 0x0000000002B3FAB0: 24 bytes ----------
Leak Hash: 0x8BA44B78 Count: 1
  Call Stack:
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\threads\juce_thread.cpp (84): juce64_debug.dll!juce::getCurrentThreadHolder + 0xA bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\threads\juce_thread.cpp (91): juce64_debug.dll!juce::Thread::threadEntryPoint + 0xA bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\threads\juce_thread.cpp (119): juce64_debug.dll!juce::juce_threadEntryPoint
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\native\juce_win32_threads.cpp (105): juce64_debug.dll!juce::threadEntryProc
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\threadex.c (348): MSVCR90D.dll!_callthreadstartex + 0x17 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\threadex.c (331): MSVCR90D.dll!_threadstartex
    0x000000007761652D (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0xD bytes
    0x000000007774C541 (File and line number not available): ntdll.dll!RtlUserThreadStart + 0x21 bytes
  Data:
    E8 25 5A E9    FE 07 00 00    01 00 00 00    CD CD CD CD     .%Z..... ........
    CD CD CD CD    CD CD CD CD                                   ........ ........
---------- Block 6760 at 0x0000000002B478E0: 39 bytes ----------
Leak Hash: 0x0547061B Count: 1
  Call Stack:
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\text\juce_string.cpp (77): juce64_debug.dll!juce::StringHolder::createUninitialisedBytes + 0xE bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\text\juce_string.cpp (96): juce64_debug.dll!juce::StringHolder::createFromCharPointer<juce::CharPointer_ASCII>
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\text\juce_string.cpp (311): juce64_debug.dll!juce::String::String
    c:\code\zyamusic\thirdparty\juce\modules\juce_graphics\fonts\juce_font.cpp (322): juce64_debug.dll!juce::Font::getDefaultSansSerifFontName + 0x2F bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_graphics\fonts\juce_font.cpp (191): juce64_debug.dll!juce::Font::SharedFontInternal::SharedFontInternal + 0x59 bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_graphics\fonts\juce_font.cpp (260): juce64_debug.dll!juce::Font::Font + 0x61 bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_gui_basics\widgets\juce_texteditor.cpp (948): juce64_debug.dll!juce::TextEditor::TextEditor + 0x339 bytes
    c:\code\zyamusic\soundbetter\soundbettermixer\src\maincomponent.cpp (39): SoundBetterMixer64_debug.exe!MainComponent::MainComponent + 0x4E bytes
    c:\code\zyamusic\soundbetter\soundbettermixer\src\appclass.cpp (62): SoundBetterMixer64_debug.exe!AppClass::initialise + 0x3A bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_events\messages\juce_applicationbase.cpp (256): juce64_debug.dll!juce::JUCEApplicationBase::initialiseApp + 0x34 bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_gui_basics\application\juce_application.cpp (89): juce64_debug.dll!juce::JUCEApplication::initialiseApp + 0xA bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_events\messages\juce_applicationbase.cpp (229): juce64_debug.dll!juce::JUCEApplicationBase::main + 0x1F bytes
    c:\code\zyamusic\soundbetter\soundbettermixer\src\main.cpp (16): SoundBetterMixer64_debug.exe!WinMain + 0x49 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtexe.c (578): SoundBetterMixer64_debug.exe!__tmainCRTStartup + 0x42 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtexe.c (403): SoundBetterMixer64_debug.exe!WinMainCRTStartup
    0x000000007761652D (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0xD bytes
    0x000000007774C541 (File and line number not available): ntdll.dll!RtlUserThreadStart + 0x21 bytes
  Data:
    00 00 00 00    CD CD CD CD    10 00 00 00    00 00 00 00     ........ ........
    3C 53 61 6E    73 2D 53 65    72 69 66 3E    00 CD CD CD     <Sans-Se rif>....
    CD CD CD CD    CD CD CD                                      ........ ........
---------- Block 6820 at 0x0000000002BF0A40: 39 bytes ----------
Leak Hash: 0x36C6F5A4 Count: 1
  Call Stack:
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\text\juce_string.cpp (77): juce64_debug.dll!juce::StringHolder::createUninitialisedBytes + 0xE bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\text\juce_string.cpp (96): juce64_debug.dll!juce::StringHolder::createFromCharPointer<juce::CharPointer_ASCII>
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\text\juce_string.cpp (311): juce64_debug.dll!juce::String::String
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\text\juce_stringpool.cpp (64): juce64_debug.dll!juce::StringPoolHelpers::getPooledStringFromArray<char const * __ptr64> + 0x12 bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\text\juce_stringpool.cpp (94): juce64_debug.dll!juce::StringPool::getPooledString + 0x1D bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_core\text\juce_identifier.cpp (61): juce64_debug.dll!juce::Identifier::Identifier
    c:\code\zyamusic\thirdparty\juce\modules\juce_gui_basics\components\juce_component.cpp (267): juce64_debug.dll!juce::Component::ComponentHelpers::getColourPropertyId + 0x12 bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_gui_basics\components\juce_component.cpp (2170): juce64_debug.dll!juce::Component::setColour + 0x32 bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_gui_basics\widgets\juce_label.cpp (39): juce64_debug.dll!juce::Label::Label
    c:\code\zyamusic\thirdparty\juce\modules\juce_gui_basics\lookandfeel\juce_lookandfeel_v2.cpp (1149): juce64_debug.dll!juce::LookAndFeel_V2::createComboBoxTextBox + 0x2F bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_gui_basics\widgets\juce_combobox.cpp (416): juce64_debug.dll!juce::ComboBox::lookAndFeelChanged + 0x37 bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_gui_basics\widgets\juce_combobox.cpp (51): juce64_debug.dll!juce::ComboBox::ComboBox
    c:\code\zyamusic\soundbetter\soundbettermixer\src\maincomponent.cpp (48): SoundBetterMixer64_debug.exe!MainComponent::MainComponent + 0x4F bytes
    c:\code\zyamusic\soundbetter\soundbettermixer\src\appclass.cpp (62): SoundBetterMixer64_debug.exe!AppClass::initialise + 0x3A bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_events\messages\juce_applicationbase.cpp (256): juce64_debug.dll!juce::JUCEApplicationBase::initialiseApp + 0x34 bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_gui_basics\application\juce_application.cpp (89): juce64_debug.dll!juce::JUCEApplication::initialiseApp + 0xA bytes
    c:\code\zyamusic\thirdparty\juce\modules\juce_events\messages\juce_applicationbase.cpp (229): juce64_debug.dll!juce::JUCEApplicationBase::main + 0x1F bytes
    c:\code\zyamusic\soundbetter\soundbettermixer\src\main.cpp (16): SoundBetterMixer64_debug.exe!WinMain + 0x49 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtexe.c (578): SoundBetterMixer64_debug.exe!__tmainCRTStartup + 0x42 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crtexe.c (403): SoundBetterMixer64_debug.exe!WinMainCRTStartup
    0x000000007761652D (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0xD bytes
    0x000000007774C541 (File and line number not available): ntdll.dll!RtlUserThreadStart + 0x21 bytes
  Data:
    00 00 00 00    CD CD CD CD    10 00 00 00    00 00 00 00     ........ ........
    6A 63 63 6C    72 5F 31 30    30 30 32 30    31 00 CD CD     jcclr_10 00201...
    CD CD CD CD    CD CD CD                                      ........ ........
 
