Commit 2ce1ca48 authored by mattijs's avatar mattijs Committed by Andrew Heather
Browse files

BUG: objectRegistry: two-pass deletion. See #1276.

parent 5dd6a04f
...@@ -334,6 +334,14 @@ bool Foam::objectRegistry::checkOut(const word& key) const ...@@ -334,6 +334,14 @@ bool Foam::objectRegistry::checkOut(const word& key) const
void Foam::objectRegistry::clear() void Foam::objectRegistry::clear()
{ {
// Free anything owned by the registry // Free anything owned by the registry
// This needs to be done in two stages:
// - collect objects-to-be-removed
// - actually delete objects
// since the destructor of the regIOobject will actually delete its
// entry from the objectRegistry which messes up the iterator.
DynamicList<regIOobject*> owned;
for (iterator iter = begin(); iter != end(); ++iter) for (iterator iter = begin(); iter != end(); ++iter)
{ {
regIOobject* ptr = iter.val(); regIOobject* ptr = iter.val();
...@@ -341,17 +349,25 @@ void Foam::objectRegistry::clear() ...@@ -341,17 +349,25 @@ void Foam::objectRegistry::clear()
if (ptr && ptr->ownedByRegistry()) if (ptr && ptr->ownedByRegistry())
{ {
// TBD: may wish to have ptr->clearWatches(); // TBD: may wish to have ptr->clearWatches();
if (objectRegistry::debug) if (objectRegistry::debug)
{ {
Pout<< "objectRegistry::clear : " << ptr->name() Pout<< "objectRegistry::clear : " << ptr->name()
<< " watches :" << flatOutput(ptr->watchIndices()) << nl; << " watches :" << flatOutput(ptr->watchIndices()) << nl;
} }
delete ptr;
owned.append(ptr);
} }
} }
for (regIOobject* objectPtr : owned)
{
// Make sure that the destructor of the regIOobject does a checkout
objectPtr->release();
delete objectPtr;
}
HashTable<regIOobject*>::clear(); HashTable<regIOobject*>::clear();
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment