From 65d640e58e30c0ff89728494f05eb1dec5693f38 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Mon, 27 Jul 2020 10:15:03 +0200 Subject: [PATCH] BUG: potential memory leaks in HashPtrTable (#1787) - using HashPtrTable::set() with the same key twice did not guarantee proper cleanup of memory since it simply used the underlying HashTable::set() without doing anything about the old memory. Now check for pre-existing storage and delete it when it does not correspond to the newly stored pointer. This problem is independent of potential memory slicing previously flagged (#1286) and only partially resolved. --- .../containers/HashTables/HashPtrTable/HashPtrTable.H | 3 ++- .../HashTables/HashPtrTable/HashPtrTableI.H | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H index d2f17d0951..ee7ea6a49b 100644 --- a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H +++ b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTable.H @@ -28,7 +28,8 @@ Class Foam::HashPtrTable Description - A HashTable of pointers to objects of type \. + A HashTable of pointers to objects of type \, + with deallocation management of the pointers. SourceFiles HashPtrTable.C diff --git a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H index b0d04f0197..08f40bd2c7 100644 --- a/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H +++ b/src/OpenFOAM/containers/HashTables/HashPtrTable/HashPtrTableI.H @@ -144,7 +144,16 @@ inline bool Foam::HashPtrTable::set T* ptr ) { - return this->parent_type::set(key, ptr); + const T* old = this->get(key); + + const bool ok = this->parent_type::set(key, ptr); + + if (ok && old != ptr) + { + delete const_cast(old); + } + + return ok; }