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