commit 4f7ea2f770cf062ef22293fbb21a086f3e0cbfcb Author: Allen Winter Date: Tue Oct 20 16:36:32 2015 -0400 backport commit b72fc5e56579035bf987075e16324ef95ef8e3d4 Author: Alex Merry Date: Mon Oct 19 20:54:13 2015 +0100 Use deleteLater in Part::slotWidgetDestroyed(). When a part's main widget is destroyed, we should not delete the part immediately - both because deleting an object from inside one of its signals is not safe generally, and because derived classes may well hold QPointers to the widgets, expecting them to be cleared between the widget being destroyed and the part being destroyed. MERGE: none diff --git a/kparts/part.cpp b/kparts/part.cpp index 20089d4..2cfee81 100644 --- a/kparts/part.cpp +++ b/kparts/part.cpp @@ -350,7 +350,7 @@ void Part::slotWidgetDestroyed() d->m_widget = 0; if (d->m_autoDeletePart) { kDebug(1000) << "deleting part" << objectName(); - delete this; // ouch, this should probably be deleteLater() + this->deleteLater(); } } diff --git a/kparts/tests/parttest.cpp b/kparts/tests/parttest.cpp index e48b578..232aa07 100644 --- a/kparts/tests/parttest.cpp +++ b/kparts/tests/parttest.cpp @@ -48,6 +48,7 @@ void PartTest::testAutoDeletePart() KParts::Part* part = new TestPart(0, 0); QPointer partPointer(part); delete part->widget(); + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); QVERIFY(partPointer.isNull()); } @@ -57,6 +58,7 @@ void PartTest::testAutoDeleteWidget() QPointer partPointer(part); QPointer widgetPointer(part->widget()); delete part; + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); QVERIFY(widgetPointer.isNull()); }