# HG changeset patch # User Chris Cannam # Date 1560256757 -3600 # Node ID 0d4236961c97678034ceb66cb56b84b2c85fdaaa # Parent b375fdbb74bc14b9f195ad2768c4dbe296d73643 Ensure that AggregateModels are actually deleted on release despite not being in model list (ugh, this is ugly) diff -r b375fdbb74bc -r 0d4236961c97 framework/Document.cpp --- a/framework/Document.cpp Fri May 17 13:49:25 2019 +0100 +++ b/framework/Document.cpp Tue Jun 11 13:39:17 2019 +0100 @@ -804,10 +804,12 @@ } bool toDelete = false; + bool isInModelList = false; // should become true for any "normal" model ModelList::iterator mitr = findModelInList(model); - + if (mitr != m_models.end()) { + if (mitr->refcount == 0) { SVCERR << "WARNING: Document::releaseModel: model " << model << " reference count is zero already!" << endl; @@ -819,6 +821,8 @@ toDelete = true; } } + isInModelList = true; + } else if (m_aggregateModels.find(model) != m_aggregateModels.end()) { #ifdef DEBUG_DOCUMENT SVDEBUG << "Document::releaseModel: is an aggregate model" << endl; @@ -848,16 +852,26 @@ << "their source fields appropriately" << endl; } - deleteModelFromList(model); + if (isInModelList) { + deleteModelFromList(model); #ifdef DEBUG_DOCUMENT - SVDEBUG << "Document::releaseModel: Deleted model " << model << endl; - SVDEBUG << "Models now: "; - for (const auto &r: m_models) { - SVDEBUG << r.model << " "; - } - SVDEBUG << endl; + SVDEBUG << "Document::releaseModel: Deleted model " << model << endl; + SVDEBUG << "Models now: "; + for (const auto &r: m_models) { + SVDEBUG << r.model << " "; + } + SVDEBUG << endl; #endif + } else { + model->aboutToDelete(); + emit modelAboutToBeDeleted(model); + delete model; + +#ifdef DEBUG_DOCUMENT + SVDEBUG << "Document::releaseModel: Deleted awkward model " << model << endl; +#endif + } } }