diff --git a/src/libs/aggregation/aggregate.cpp b/src/libs/aggregation/aggregate.cpp index 7be6437ae2f..11d13907f33 100644 --- a/src/libs/aggregation/aggregate.cpp +++ b/src/libs/aggregation/aggregate.cpp @@ -193,6 +193,9 @@ void Aggregate::deleteSelf(QObject *obj) QWriteLocker locker(&lock()); aggregateMap().remove(obj); m_components.removeAll(obj); + // Avoid issues if obj was child of another component of the aggregate. + // The parent is deleted in ~Aggregate and might still have a reference on obj + obj->setParent({}); } delete this; } diff --git a/tests/auto/aggregation/tst_aggregate.cpp b/tests/auto/aggregation/tst_aggregate.cpp index eef9a32400c..fe865be59e7 100644 --- a/tests/auto/aggregation/tst_aggregate.cpp +++ b/tests/auto/aggregation/tst_aggregate.cpp @@ -78,6 +78,24 @@ void tst_Aggregate::deleteAggregation() component1 = new Interface1; delete component1; QVERIFY(component1 == 0); + + // do not crash if components are in a child/parent relationship + // parent deleted first + aggregation = new Aggregation::Aggregate; + component1 = new Interface1; + component2 = new Interface2; + component2->setParent(component1); + aggregation->add(component1); + aggregation->add(component2); + delete component1; + // child deleted first + aggregation = new Aggregation::Aggregate; + component1 = new Interface1; + component2 = new Interface2; + component2->setParent(component1); + aggregation->add(component1); + aggregation->add(component2); + delete component2; } void tst_Aggregate::queryAggregation()