From 47493f50f1f03ce26a097624350bedfdf89d7edc Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@esi-group.com> Date: Wed, 23 Jan 2019 15:52:43 +0100 Subject: [PATCH] BUG: clearing objectRegistry can leak memory (#1180) - now free anything owned by the registry when doing a clear. - the myriad of other ways to remove items (and potentially leaking) have not yet been addressed: * set, erase, retain, filterKeys, filterValues, filterEntries --- .../db/objectRegistry/objectRegistry.C | 42 ++++++++++++------- .../db/objectRegistry/objectRegistry.H | 15 +++++-- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/OpenFOAM/db/objectRegistry/objectRegistry.C b/src/OpenFOAM/db/objectRegistry/objectRegistry.C index e3310a4007..ad1e7e0cf6 100644 --- a/src/OpenFOAM/db/objectRegistry/objectRegistry.C +++ b/src/OpenFOAM/db/objectRegistry/objectRegistry.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015-2018 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -85,21 +85,7 @@ Foam::objectRegistry::objectRegistry(const IOobject& io, const label nObjects) Foam::objectRegistry::~objectRegistry() { - List<regIOobject*> myObjects(size()); - label nObjects = 0; - - for (iterator iter = begin(); iter != end(); ++iter) - { - if (iter.val()->ownedByRegistry()) - { - myObjects[nObjects++] = iter.val(); - } - } - - for (label i=0; i < nObjects; ++i) - { - checkOut(*myObjects[i]); - } + objectRegistry::clear(); } @@ -265,6 +251,30 @@ bool Foam::objectRegistry::checkOut(regIOobject& io) const } +void Foam::objectRegistry::clear() +{ + // Free anything owned by the registry + for (iterator iter = begin(); iter != end(); ++iter) + { + regIOobject* ptr = iter.val(); + + if (ptr && ptr->ownedByRegistry()) + { + delete ptr; + } + } + + HashTable<regIOobject*>::clear(); +} + + +void Foam::objectRegistry::clearStorage() +{ + objectRegistry::clear(); + HashTable<regIOobject*>::clearStorage(); +} + + void Foam::objectRegistry::rename(const word& newName) { regIOobject::rename(newName); diff --git a/src/OpenFOAM/db/objectRegistry/objectRegistry.H b/src/OpenFOAM/db/objectRegistry/objectRegistry.H index f5fafbe510..8f94499ff7 100644 --- a/src/OpenFOAM/db/objectRegistry/objectRegistry.H +++ b/src/OpenFOAM/db/objectRegistry/objectRegistry.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2016-2018 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2016-2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -430,15 +430,22 @@ public: // Edit - //- Rename - virtual void rename(const word& newName); - //- Add a regIOobject to registry bool checkIn(regIOobject& io) const; //- Remove a regIOobject from registry bool checkOut(regIOobject& io) const; + //- Clear all entries from the registry + // Performs a checkOut() for all objects that are ownedByRegistry + void clear(); + + //- Clear all entries from the registry and the table itself. + void clearStorage(); + + //- Rename + virtual void rename(const word& newName); + // Reading -- GitLab