ENH: avoid memory leaks for HashPtrTable, PtrMap insertion (issue #749)

- disallow insert() of raw pointers, since a failed insertion
  (ie, entry already existed) results in an unmanaged pointer.

  Either insert using an autoPtr, or set() with raw pointers or autoPtr.

- IOobjectList::add() now takes an autoPtr instead of an object reference

- IOobjectList::remove() now returns an autoPtr instead of a raw pointer
This commit is contained in:
Mark Olesen
2018-05-17 09:56:36 +01:00
parent 46b768628c
commit 48d654cf19
30 changed files with 549 additions and 261 deletions

View File

@ -813,28 +813,33 @@ int main(int argc, char *argv[])
// Read all fields in time and constant directories
IOobjectList objects(mesh, runTime.timeName());
IOobjectList timeObjects(IOobjectList(mesh, mesh.facesInstance()));
forAllConstIter(IOobjectList, timeObjects, iter)
{
if
(
iter()->headerClassName() == volScalarField::typeName
|| iter()->headerClassName() == volVectorField::typeName
|| iter()->headerClassName() == volSphericalTensorField::typeName
|| iter()->headerClassName() == volTensorField::typeName
|| iter()->headerClassName() == volSymmTensorField::typeName
|| iter()->headerClassName() == surfaceScalarField::typeName
|| iter()->headerClassName() == surfaceVectorField::typeName
|| iter()->headerClassName()
== surfaceSphericalTensorField::typeName
|| iter()->headerClassName() == surfaceSymmTensorField::typeName
|| iter()->headerClassName() == surfaceTensorField::typeName
)
IOobjectList timeObjects(mesh, mesh.facesInstance());
// Transfer specific types
forAllIters(timeObjects, iter)
{
objects.add(*iter());
autoPtr<IOobject> objPtr(timeObjects.remove(iter));
const auto& obj = *objPtr;
if
(
obj.headerClassName() == volScalarField::typeName
|| obj.headerClassName() == volVectorField::typeName
|| obj.headerClassName() == volSphericalTensorField::typeName
|| obj.headerClassName() == volTensorField::typeName
|| obj.headerClassName() == volSymmTensorField::typeName
|| obj.headerClassName() == surfaceScalarField::typeName
|| obj.headerClassName() == surfaceVectorField::typeName
|| obj.headerClassName() == surfaceSphericalTensorField::typeName
|| obj.headerClassName() == surfaceSymmTensorField::typeName
|| obj.headerClassName() == surfaceTensorField::typeName
)
{
objects.add(objPtr);
}
}
}
// Read vol fields and subset.
wordList scalarNames(objects.names(volScalarField::typeName));