From 0a497287270d479d7fde5109b2b51683b590c8b2 Mon Sep 17 00:00:00 2001 From: Knud Dollereder Date: Wed, 9 Jun 2021 16:00:51 +0200 Subject: [PATCH] Fix a crash-on-close in the dockmanager The destructor of DockManager deletes floatingwidgets in a for loop. The destructor of these floatingWidgets calls back to the DockManager and alters the list it is currently iterating over. This is now quick-fixed by deferring the deletion by using a temporal vector. Change-Id: I40b77ea505a5fc7506117dc16476e2e498ce4aef Reviewed-by: Thomas Hartmann --- src/libs/advanceddockingsystem/dockmanager.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/libs/advanceddockingsystem/dockmanager.cpp b/src/libs/advanceddockingsystem/dockmanager.cpp index 7ae018b9129..5301e08c0b1 100644 --- a/src/libs/advanceddockingsystem/dockmanager.cpp +++ b/src/libs/advanceddockingsystem/dockmanager.cpp @@ -357,13 +357,20 @@ namespace ADS save(); saveStartupWorkspace(); + // Using a temporal vector since the destructor of + // FloatingDockWidgetContainer alters d->m_floatingWidgets. + std::vector aboutToDeletes; for (auto floatingWidget : qAsConst(d->m_floatingWidgets)) { - /* There have been crashes with partially destructed widgets in - m_floatingWidgets. Those do not have a parent. */ - if (floatingWidget && floatingWidget->parent() == this) - delete floatingWidget.data(); + if (floatingWidget) + aboutToDeletes.push_back(floatingWidget); } + + for (auto del : aboutToDeletes) { + delete del; + } + d->m_floatingWidgets.clear(); + delete d; }