From 1a67fefcc60f162dacab57c35234c3724c3bad57 Mon Sep 17 00:00:00 2001 From: Ricardo Rodriguez Date: Wed, 19 Feb 2025 23:59:30 -0500 Subject: [PATCH] mem fixes (#8276) --- Code/GraphMol/DistGeomHelpers/Embedder.cpp | 19 ++++++------ .../Fingerprints/fpgen_catch_tests.cpp | 3 +- External/INCHI-API/inchi.cpp | 31 +++++++------------ 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/Code/GraphMol/DistGeomHelpers/Embedder.cpp b/Code/GraphMol/DistGeomHelpers/Embedder.cpp index 772817b7b..1b368030d 100644 --- a/Code/GraphMol/DistGeomHelpers/Embedder.cpp +++ b/Code/GraphMol/DistGeomHelpers/Embedder.cpp @@ -837,16 +837,19 @@ bool embedPoints(RDGeom::PointPtrVect *positions, detail::EmbedArgs eargs, embedParams.basinThresh = 1e8; } + std::unique_ptr generator; + std::unique_ptr distrib; + std::unique_ptr rngMgr; + RDKit::double_source_type *rng = nullptr; - RDKit::rng_type *generator = nullptr; - RDKit::uniform_double *distrib = nullptr; CHECK_INVARIANT(seed >= -1, "random seed must either be positive, zero, or negative one"); if (seed > -1) { - generator = new RDKit::rng_type(42u); + generator.reset(new RDKit::rng_type(42u)); generator->seed(seed); - distrib = new RDKit::uniform_double(0.0, 1.0); - rng = new RDKit::double_source_type(*generator, *distrib); + distrib.reset(new RDKit::uniform_double(0.0, 1.0)); + rngMgr.reset(new RDKit::double_source_type(*generator, *distrib)); + rng = rngMgr.get(); } else { rng = &RDKit::getDoubleRandomSource(); } @@ -987,11 +990,7 @@ bool embedPoints(RDGeom::PointPtrVect *positions, detail::EmbedArgs eargs, } } // while - if (seed > -1) { - delete rng; - delete generator; - delete distrib; - } + return gotCoords; } diff --git a/Code/GraphMol/Fingerprints/fpgen_catch_tests.cpp b/Code/GraphMol/Fingerprints/fpgen_catch_tests.cpp index 6e66d3822..d85ac91d2 100644 --- a/Code/GraphMol/Fingerprints/fpgen_catch_tests.cpp +++ b/Code/GraphMol/Fingerprints/fpgen_catch_tests.cpp @@ -464,7 +464,8 @@ TEST_CASE("github #6679: suspicious value for atom pair code calculation") { {"C[I]", 7918328}, {"C[Te]", 7918456}, {"C[Sb]", 7918584}, {"C[Sn]", 7918200}, {"C[Xe]", 7918200}, {"C[Li]", 7918200}, }; - auto fpg = AtomPair::getAtomPairGenerator(); + std::unique_ptr> fpg{ + AtomPair::getAtomPairGenerator()}; for (const auto &pr : data) { auto mol = v2::SmilesParse::MolFromSmiles(pr.first); REQUIRE(mol); diff --git a/External/INCHI-API/inchi.cpp b/External/INCHI-API/inchi.cpp index 191e1fab0..14b6a9ad1 100644 --- a/External/INCHI-API/inchi.cpp +++ b/External/INCHI-API/inchi.cpp @@ -1760,7 +1760,7 @@ std::string MolToInchi(const ROMol &mol, ExtraInchiReturnValues &rv, unsigned int nBonds = m->getNumBonds(); // Make array of inchi_atom (storage space) - auto *inchiAtoms = new inchi_Atom[nAtoms]; + std::unique_ptr inchiAtoms(new inchi_Atom[nAtoms]); // and a vector for stereo0D std::vector stereo0DEntries; @@ -2048,24 +2048,23 @@ std::string MolToInchi(const ROMol &mol, ExtraInchiReturnValues &rv, } // create stereo0D - inchi_Stereo0D *stereo0Ds; + std::unique_ptr stereo0Ds; if (stereo0DEntries.size()) { - stereo0Ds = new inchi_Stereo0D[stereo0DEntries.size()]; + stereo0Ds.reset(new inchi_Stereo0D[stereo0DEntries.size()]); for (unsigned int i = 0; i < stereo0DEntries.size(); i++) { stereo0Ds[i] = stereo0DEntries[i]; } - } else { - stereo0Ds = nullptr; } // create input inchi_Input input; - input.atom = inchiAtoms; - input.stereo0D = stereo0Ds; + input.atom = inchiAtoms.get(); + input.stereo0D = stereo0Ds.get(); + std::unique_ptr _options; if (options) { - char *_options = new char[strlen(options) + 1]; - fixOptionSymbol(options, _options); - input.szOptions = _options; + _options.reset(new char[strlen(options) + 1]); + fixOptionSymbol(options, _options.get()); + input.szOptions = _options.get(); } else { input.szOptions = nullptr; } @@ -2098,14 +2097,6 @@ std::string MolToInchi(const ROMol &mol, ExtraInchiReturnValues &rv, // clean up FreeINCHI(&output); } - if (input.szOptions) { - delete[] input.szOptions; - } - - delete[] inchiAtoms; - if (stereo0Ds) { - delete[] stereo0Ds; - } return inchi; } @@ -2153,7 +2144,9 @@ std::string InchiToInchiKey(const std::string &inchi) { char inchiKey[29]; char xtra1[65], xtra2[65]; int ret = 0; - { ret = GetINCHIKeyFromINCHI(inchi.c_str(), 0, 0, inchiKey, xtra1, xtra2); } + { + ret = GetINCHIKeyFromINCHI(inchi.c_str(), 0, 0, inchiKey, xtra1, xtra2); + } std::string error; switch (ret) { case INCHIKEY_OK: