From aeceb1987bb607d99b2236f82c5fc61ea71af91a Mon Sep 17 00:00:00 2001 From: scott snyder <snyder@bnl.gov> Date: Tue, 8 Dec 2020 22:43:01 +0100 Subject: [PATCH] TileTrackingGeometry: Fix memory leaks CompactBinnedArray maps bins in some coordinates to a vector of pointers to objects. It does not own this objects. BinnedMaterial uses CompactBinnedArray, with the object in question being a pair<> object. When a BinnedMaterial is constructed, it takes a vector of pointers to these pairs. It does not take ownership of this pairs, but just passes them to the CompactBinnedArray. The callers of BinnedMaterial also do not take ownership of these pairs. So they are presently leaked. Further, BinnedMaterial can't just delete them, because these pairs get shared between multiple BinnedMaterial instances. We restructure like this. BinnnedMaterial now gets a vector of pairs, which it saves as a member. The CompactBinnedArray is then constructed to that it points at the pairs in this vector. BinnedMaterial now effectively owns the pairs. These are now duplicated in each BinnedMaterial, but that should be ok. We also need to extend CompactBinnedArray so that we can give it a new vector of object pointers when it is cloned. cf ATLASRECTS-5831. --- .../src/TileVolumeBuilder.cxx | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx b/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx index 6c571e9e7004..ca6732cc16d8 100755 --- a/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx +++ b/TileCalorimeter/TileTrackingGeometry/src/TileVolumeBuilder.cxx @@ -199,23 +199,23 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking ATH_MSG_DEBUG( "Retrieved " << numTreeTops << " tree tops from the TileDetDescrManager. " ); // layer material can be adjusted here - std::vector<const Trk::IdentifiedMaterial*> matTB; + std::vector<Trk::IdentifiedMaterial> matTB; int baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 12; - matTB.push_back(new std::pair<const Trk::Material*,int>(barrelProperties,0)); - matTB.push_back(new std::pair<const Trk::Material*,int>(barrelProperties,baseID)); - matTB.push_back(new std::pair<const Trk::Material*,int>(barrelProperties,baseID+1)); - matTB.push_back(new std::pair<const Trk::Material*,int>(barrelProperties,baseID+2)); + matTB.emplace_back(barrelProperties,0); + matTB.emplace_back(barrelProperties,baseID); + matTB.emplace_back(barrelProperties,baseID+1); + matTB.emplace_back(barrelProperties,baseID+2); // material index std::vector<size_t> ltb{0,1,2,3}; // layer material can be adjusted here - std::vector<const Trk::IdentifiedMaterial*> matETB; + std::vector<Trk::IdentifiedMaterial> matETB; baseID = Trk::GeometrySignature(Trk::Calo)*1000 + 18; - matETB.push_back(new std::pair<const Trk::Material*,int>(extendedBarrelProperties,0)); - matETB.push_back(new std::pair<const Trk::Material*,int>(extendedBarrelProperties,baseID)); - matETB.push_back(new std::pair<const Trk::Material*,int>(extendedBarrelProperties,baseID+1)); - matETB.push_back(new std::pair<const Trk::Material*,int>(extendedBarrelProperties,baseID+2)); + matETB.emplace_back(extendedBarrelProperties,0); + matETB.emplace_back(extendedBarrelProperties,baseID); + matETB.emplace_back(extendedBarrelProperties,baseID+1); + matETB.emplace_back(extendedBarrelProperties,baseID+2); // layer material can be adjusted here //Trk::MaterialProperties barrelFingerGapProperties = Trk::MaterialProperties(1., 130./0.35, 0.003*pow(0.35,3),30.); @@ -438,12 +438,12 @@ const std::vector<const Trk::TrackingVolume*>* Tile::TileVolumeBuilder::tracking double tileExtZ = tilePositiveExtendedBarrel->center().z()-tilePositiveExtendedBarrelBounds.halflengthZ(); // binned material for ITC : - std::vector<const Trk::IdentifiedMaterial*> matITC; + std::vector<Trk::IdentifiedMaterial> matITC; // layer material can be adjusted here baseID = Trk::GeometrySignature(Trk::Calo)*1000; - matITC.push_back(new Trk::IdentifiedMaterial(barrelProperties,baseID+15)); - matITC.push_back(new Trk::IdentifiedMaterial(barrelProperties,baseID+16)); - matITC.push_back(new Trk::IdentifiedMaterial(barrelProperties,baseID+17)); + matITC.emplace_back(barrelProperties,baseID+15); + matITC.emplace_back(barrelProperties,baseID+16); + matITC.emplace_back(barrelProperties,baseID+17); // ITCPlug1 double p1Z = 0.5*(plug1Z-plug1hZ+tileExtZ); -- GitLab