So the symptom is assert and crash upon exit, plugin executing in AudiPluginHost or as Standalone. Plugin runs fine before the exit event.
I’ve narrowed the problem down to the pattern of code generated by the GUI Builder. It allocates Sliders via ‘new’ in the Editor, and generates pointers as member variables.
I could switch over to use member Sliders without pointers (which seems to fix the issue), but then I’d lose the connection with GUI builder for my Editor, which I’m fond of.
So the question is what’s causing the crash on exit and can it be cured, without replacing these patterns? The plugin works fine until shutdown.
———
EditorComponent.cpp:
OutputVolumeSliderMemberName.reset ( new Slider ("OutputVolumeSliderName"));
addAndMakeVisible (OutputVolumeSliderMemberName.get());
OutputVolumeSliderMemberName->setRange (-30, 30, 0.1);
OutputVolumeSliderMemberName->setSliderStyle (Slider::LinearHorizontal);
OutputVolumeSliderMemberName->setTextBoxStyle (Slider::TextBoxLeft, false , 80, 20);
OutputVolumeSliderMemberName->setBounds (544, 64, 264, 24);
OutputVolumeSliderMemberName->setTextValueSuffix (" dB");
OutputVolumeSliderMemberName->attachToComponent(OutputVolumeSliderLabelMemberName.get(), true );
OutputVolumeSliderAttachment.reset (new SliderAttachment (processor.parameters, "OutputVolumeParamID",*OutputVolumeSliderMemberName));
EditorComponent.h
std::unique_ptr<Slider> OutputVolumeSliderMemberName;
std::unique_ptr<SliderAttachment> OutputVolumeSliderAttachment;
———
Here’s the assert that hits in juce_HeapBlock.h:
inline ElementType begin() const noexcept
{
return elements; `JUCE Message Thread (1): EXC_BAD_ACCESS (code=1, address=0x30)`
}
———
Here’s the first 20 lines of the stack trace.
JUCE Message Thread (1) Queue : com.apple.main-thread (serial)
#0 0x00000001006a2f8c in juce::HeapBlock<juce::Slider::Listener*, false>::operator juce::Slider::Listener**() const at /Users/me/JUCE/modules/juce_core/memory/juce_HeapBlock.h:182
#1 0x00000001006a2f55 in juce::ArrayBase<juce::Slider::Listener*, juce::DummyCriticalSection>::begin() const at /Users/me/JUCE/modules/juce_core/containers/juce_ArrayBase.h:164
#2 0x00000001006a33e5 in juce::Array<juce::Slider::Listener*, juce::DummyCriticalSection, 0>::removeFirstMatchingValue(juce::Slider::Listener*) at /Users/me/JUCE/modules/juce_core/containers/juce_Array.h:790
#3 0x0000000100545308 in juce::ListenerList<juce::Slider::Listener, juce::Array<juce::Slider::Listener*, juce::DummyCriticalSection, 0> >::remove(juce::Slider::Listener*) at /Users/me/JUCE/modules/juce_core/containers/juce_ListenerList.h:98
#4 0x000000010054528e in juce::Slider::removeListener(juce::Slider::Listener*) at /Users/me/JUCE/modules/juce_gui_basics/widgets/juce_Slider.cpp:1403
#5 0x00000001001d5140 in juce::AudioProcessorValueTreeState::SliderAttachment::Pimpl::~Pimpl() at /Users/me/JUCE/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp:589
#6 0x00000001001cb9d5 in juce::AudioProcessorValueTreeState::SliderAttachment::Pimpl::~Pimpl() at /Users/me/JUCE/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp:588
#7 0x00000001001cb9f9 in juce::AudioProcessorValueTreeState::SliderAttachment::Pimpl::~Pimpl() at /Users/me/JUCE/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp:588
#8 0x00000001001a5e5c in std::__1::default_delete<juce::AudioProcessorValueTreeState::SliderAttachment::Pimpl>::operator()(juce::AudioProcessorValueTreeState::SliderAttachment::Pimpl*) const [inlined] at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:2285
#9 0x00000001001a5e37 in std::__1::unique_ptr<juce::AudioProcessorValueTreeState::SliderAttachment::Pimpl, std::__1::default_delete<juce::AudioProcessorValueTreeState::SliderAttachment::Pimpl> >::reset(juce::AudioProcessorValueTreeState::SliderAttachment::Pimpl*) [inlined] at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:2598
#10 0x00000001001a5dea in std::__1::unique_ptr<juce::AudioProcessorValueTreeState::SliderAttachment::Pimpl, std::__1::default_delete<juce::AudioProcessorValueTreeState::SliderAttachment::Pimpl> >::~unique_ptr() [inlined] at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:2552
#11 0x00000001001a5dea in std::__1::unique_ptr<juce::AudioProcessorValueTreeState::SliderAttachment::Pimpl, std::__1::default_delete<juce::AudioProcessorValueTreeState::SliderAttachment::Pimpl> >::~unique_ptr() [inlined] at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:2552
#12 0x00000001001a5dea in juce::AudioProcessorValueTreeState::SliderAttachment::~SliderAttachment() at /Users/me/JUCE/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp:626
#13 0x00000001001a5ea5 in juce::AudioProcessorValueTreeState::SliderAttachment::~SliderAttachment() at /Users/me/JUCE/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp:626
#14 0x0000000100037987 in std::__1::default_delete<juce::AudioProcessorValueTreeState::SliderAttachment>::operator()(juce::AudioProcessorValueTreeState::SliderAttachment*) const [inlined] at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:2285
#15 0x0000000100037963 in std::__1::unique_ptr<juce::AudioProcessorValueTreeState::SliderAttachment, std::__1::default_delete<juce::AudioProcessorValueTreeState::SliderAttachment> >::reset(juce::AudioProcessorValueTreeState::SliderAttachment*) [inlined] at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:2598
#16 0x00000001000378e6 in std::__1::unique_ptr<juce::AudioProcessorValueTreeState::SliderAttachment, std::__1::default_delete<juce::AudioProcessorValueTreeState::SliderAttachment> >::~unique_ptr() [inlined] at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:2552
#17 0x00000001000378e6 in std::__1::unique_ptr<juce::AudioProcessorValueTreeState::SliderAttachment, std::__1::default_delete<juce::AudioProcessorValueTreeState::SliderAttachment> >::~unique_ptr() [inlined] at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:2552
#18 0x00000001000378e6 in EditorComponent::~EditorComponent() at /Users/me/Documents/JuceProjects/Project1/Source/EditorComponent.cpp:831
#19 0x0000000100037bf5 in EditorComponent::~EditorComponent() at /Users/me/Documents/JuceProjects/Project1/Source/EditorComponent.cpp:769
#20 0x0000000100037c79 in EditorComponent::~EditorComponent() at /Users/me/Documents/JuceProjects/Project1/Source/EditorComponent.cpp:769