Hi
Juce 6.1.6.
In a situation where I create a ListBox and ListBoxModel with a custom rowComponent, and when that rowComponent contains itself a component which has accessibility, and when I exit my program with that list box on display, I get a segfault in unwinding the destructors. The reason for this is, it seems, that the ListBox contains a weak pointer to the ListBoxModel - which is fine once the ListBox is destroyed - but the accessibility handlers keep references to the individual components of the listbox.
The crash I get is here
AccessibleState getCurrentState() const override
{
if (auto* m = rowComponent.owner.getModel())
if (rowComponent.row >= m->getNumRows())
return AccessibleState().withIgnored();
the ‘m’ is a dead pointer at this point in the stack. This happens in the destruction of the rows subordinate button, whether I use my custom button class or a juce::TextButton.
The relevant stack is below. This problem is actually pretty easy for me to work around. In the destructor of the component holding the list box, before I free, I set the listboxmodel to nullptr. That is, I do
KeyBindingsOverlay::~KeyBindingsOverlay()
{
bindingList->setModel(nullptr);
}
But this order issue only occurs with the accessible feature of a subcomponent of the row component activated, so thought you may want to take a look. and figure I would post it here in case other people are making accessible rows with tables.
Here’s the full stack if it helps.
0 Surge XT 0x100fa23a0 juce::ListBox::RowComponent::RowAccessibilityHandler::getCurrentState() const + 76
1 Surge XT 0x100fa2378 juce::ListBox::RowComponent::RowAccessibilityHandler::getCurrentState() const + 36
2 Surge XT 0x100e56a78 juce::AccessibilityHandler::isIgnored() const + 64
3 Surge XT 0x100e56f40 juce::getUnignoredAncestor(juce::AccessibilityHandler*) + 48
4 Surge XT 0x100e56eb4 juce::AccessibilityHandler::getParent() const + 56
5 Surge XT 0x100e575c4 juce::AccessibilityHandler::isParentOf(juce::AccessibilityHandler const*) const + 52
6 Surge XT 0x100e569d4 juce::AccessibilityHandler::hasFocus(bool) const + 124
7 Surge XT 0x100e5670c juce::AccessibilityHandler::giveAwayFocus() const + 36
8 Surge XT 0x100e5664c juce::AccessibilityHandler::~AccessibilityHandler() + 44
9 Surge XT 0x10093ff08 Surge::Widgets::MultiSwitchAHMenuOnly::~MultiSwitchAHMenuOnly() + 56
10 Surge XT 0x10093e034 Surge::Widgets::MultiSwitchAHMenuOnly::~MultiSwitchAHMenuOnly() + 28
11 Surge XT 0x10093e060 Surge::Widgets::MultiSwitchAHMenuOnly::~MultiSwitchAHMenuOnly() + 28
12 Surge XT 0x101012f80 std::__1::default_delete<juce::AccessibilityHandler>::operator()(juce::AccessibilityHandler*) const + 52
13 Surge XT 0x101012ef4 std::__1::unique_ptr<juce::AccessibilityHandler, std::__1::default_delete<juce::AccessibilityHandler> >::reset(juce::AccessibilityHandler*) + 96
14 Surge XT 0x101012e84 std::__1::unique_ptr<juce::AccessibilityHandler, std::__1::default_delete<juce::AccessibilityHandler> >::~unique_ptr() + 32
15 Surge XT 0x100e58e7c std::__1::unique_ptr<juce::AccessibilityHandler, std::__1::default_delete<juce::AccessibilityHandler> >::~unique_ptr() + 28
16 Surge XT 0x100e58664 juce::Component::~Component() + 684
17 Surge XT 0x100928274 Surge::Widgets::MultiSwitch::~MultiSwitch() + 152
18 Surge XT 0x10092f358 Surge::Widgets::MultiSwitchSelfDraw::~MultiSwitchSelfDraw() + 128
19 Surge XT 0x1007dccd8 Surge::Widgets::SelfDrawButton::~SelfDrawButton() + 140
20 Surge XT 0x1007dac20 Surge::Widgets::SelfDrawButton::~SelfDrawButton() + 28
21 Surge XT 0x1007dac4c Surge::Widgets::SelfDrawButton::~SelfDrawButton() + 28
22 Surge XT 0x1006757f4 std::__1::default_delete<Surge::Widgets::SelfDrawButton>::operator()(Surge::Widgets::SelfDrawButton*) const + 52
23 Surge XT 0x100675768 std::__1::unique_ptr<Surge::Widgets::SelfDrawButton, std::__1::default_delete<Surge::Widgets::SelfDrawButton> >::reset(Surge::Widgets::SelfDrawButton*) + 96
24 Surge XT 0x1006756f8 std::__1::unique_ptr<Surge::Widgets::SelfDrawButton, std::__1::default_delete<Surge::Widgets::SelfDrawButton> >::~unique_ptr() + 32
25 Surge XT 0x100670a8c std::__1::unique_ptr<Surge::Widgets::SelfDrawButton, std::__1::default_delete<Surge::Widgets::SelfDrawButton> >::~unique_ptr() + 28
26 Surge XT 0x100684940 Surge::Overlays::KeyBindingsListRow::~KeyBindingsListRow() + 48
27 Surge XT 0x10068122c Surge::Overlays::KeyBindingsListRow::~KeyBindingsListRow() + 28
28 Surge XT 0x100681258 Surge::Overlays::KeyBindingsListRow::~KeyBindingsListRow() + 28
29 Surge XT 0x101065f4c std::__1::default_delete<juce::Component>::operator()(juce::Component*) const + 52
30 Surge XT 0x100e9ac6c std::__1::unique_ptr<juce::Component, std::__1::default_delete<juce::Component> >::reset(juce::Component*) + 96
31 Surge XT 0x101026d34 std::__1::unique_ptr<juce::Component, std::__1::default_delete<juce::Component> >::~unique_ptr() + 32
32 Surge XT 0x100e9a8ec std::__1::unique_ptr<juce::Component, std::__1::default_delete<juce::Component> >::~unique_ptr() + 28
33 Surge XT 0x100fa14c8 juce::ListBox::RowComponent::~RowComponent() + 72
34 Surge XT 0x100fa0b48 juce::ListBox::RowComponent::~RowComponent() + 28
35 Surge XT 0x100fa0b74 juce::ListBox::RowComponent::~RowComponent() + 28
36 Surge XT 0x100f9f39c juce::ContainerDeletePolicy<juce::ListBox::RowComponent>::destroy(juce::ListBox::RowComponent*) + 64
37 Surge XT 0x100f9f09c juce::OwnedArray<juce::ListBox::RowComponent, juce::DummyCriticalSection>::deleteAllObjects() + 104
38 Surge XT 0x100f9efe0 juce::OwnedArray<juce::ListBox::RowComponent, juce::DummyCriticalSection>::~OwnedArray() + 28
39 Surge XT 0x100f9e564 juce::OwnedArray<juce::ListBox::RowComponent, juce::DummyCriticalSection>::~OwnedArray() + 28
40 Surge XT 0x100f9f708 juce::ListBox::ListViewport::~ListViewport() + 96
41 Surge XT 0x100f9e590 juce::ListBox::ListViewport::~ListViewport() + 28
42 Surge XT 0x100f9e5bc juce::ListBox::ListViewport::~ListViewport() + 28
43 Surge XT 0x1010bb348 std::__1::default_delete<juce::ListBox::ListViewport>::operator()(juce::ListBox::ListViewport*) const + 52
44 Surge XT 0x100efa6f0 std::__1::unique_ptr<juce::ListBox::ListViewport, std::__1::default_delete<juce::ListBox::ListViewport> >::reset(juce::ListBox::ListViewport*) + 96
45 Surge XT 0x100e909fc juce::ListBox::~ListBox() + 84
46 Surge XT 0x100e946c0 juce::ListBox::~ListBox() + 28
47 Surge XT 0x100efa844 juce::ListBox::~ListBox() + 28
48 Surge XT 0x1006759fc std::__1::default_delete<juce::ListBox>::operator()(juce::ListBox*) const + 52
49 Surge XT 0x100675970 std::__1::unique_ptr<juce::ListBox, std::__1::default_delete<juce::ListBox> >::reset(juce::ListBox*) + 96
50 Surge XT 0x100675900 std::__1::unique_ptr<juce::ListBox, std::__1::default_delete<juce::ListBox> >::~unique_ptr() + 32
51 Surge XT 0x100670f64 std::__1::unique_ptr<juce::ListBox, std::__1::default_delete<juce::ListBox> >::~unique_ptr() + 28
52 Surge XT 0x100671048 Surge::Overlays::KeyBindingsOverlay::~KeyBindingsOverlay() + 72
53 Surge XT 0x1006710a0 Surge::Overlays::KeyBindingsOverlay::~KeyBindingsOverlay() + 28
54 Surge XT 0x1006710e8 Surge::Overlays::KeyBindingsOverlay::~KeyBindingsOverlay() + 28
55 Surge XT 0x100778948 std::__1::default_delete<juce::Component>::operator()(juce::Component*) const + 52
56 Surge XT 0x1007788bc std::__1::unique_ptr<juce::Component, std::__1::default_delete<juce::Component> >::reset(juce::Component*) + 96
57 Surge XT 0x10077884c std::__1::unique_ptr<juce::Component, std::__1::default_delete<juce::Component> >::~unique_ptr() + 32
58 Surge XT 0x10076f144 std::__1::unique_ptr<juce::Component, std::__1::default_delete<juce::Component> >::~unique_ptr() + 28
59 Surge XT 0x10076f28c Surge::Overlays::OverlayWrapper::~OverlayWrapper() + 132
60 Surge XT 0x10076f36c Surge::Overlays::OverlayWrapper::~OverlayWrapper() + 28
61 Surge XT 0x100771814 Surge::Overlays::OverlayWrapper::~OverlayWrapper() + 28
