Ignore:
Timestamp:
Jul 3, 2010, 2:02:26 PM (15 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
2a374e
Parents:
b9c847
git-author:
Frederik Heber <heber@…> (07/03/10 13:24:25)
git-committer:
Frederik Heber <heber@…> (07/03/10 14:02:26)
Message:

MEMFIXES: ListOfLocalAtoms in molecule::FragmentMolecule() was not free'd correctly.

NOTE: All of these lists and maps are hard to understand and make the code very confusing. It's really high time for refactoring.

Signed-off-by: Frederik Heber <heber@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/moleculelist.cpp

    rb9c847 rc27778  
    10171017 * \param *out output stream for debugging
    10181018 * \param *reference reference molecule with the bond structure to be copied
    1019  * \param &FragmentCounter Counter needed to address \a **ListOfLocalAtoms
    1020  * \param ***ListOfLocalAtoms Lookup table for each subgraph and index of each atom in \a *reference, may be NULL on start, then it is filled
     1019 * \param **&ListOfLocalAtoms Lookup table for this subgraph and index of each atom in \a *reference, may be NULL on start, then it is filled
    10211020 * \param FreeList true - ***ListOfLocalAtoms is free'd before return, false - it is not
    10221021 * \return true - success, false - faoilure
    10231022 */
    1024 bool MoleculeLeafClass::FillBondStructureFromReference(const molecule * const reference, int &FragmentCounter, atom ***&ListOfLocalAtoms, bool FreeList)
     1023bool MoleculeLeafClass::FillBondStructureFromReference(const molecule * const reference, atom **&ListOfLocalAtoms, bool FreeList)
    10251024{
    10261025  atom *OtherWalker = NULL;
     
    10311030  DoLog(1) && (Log() << Verbose(1) << "Begin of FillBondStructureFromReference." << endl);
    10321031  // fill ListOfLocalAtoms if NULL was given
    1033   if (!FillListOfLocalAtoms(ListOfLocalAtoms, FragmentCounter, reference->getAtomCount(), FreeList)) {
     1032  if (!FillListOfLocalAtoms(ListOfLocalAtoms, reference->getAtomCount(), FreeList)) {
    10341033    DoLog(1) && (Log() << Verbose(1) << "Filling of ListOfLocalAtoms failed." << endl);
    10351034    return false;
     
    10481047      AtomNo = Father->nr; // global id of the current walker
    10491048      for (BondList::const_iterator Runner = Father->ListOfBonds.begin(); Runner != Father->ListOfBonds.end(); (++Runner)) {
    1050         OtherWalker = ListOfLocalAtoms[FragmentCounter][(*Runner)->GetOtherAtom((*iter)->GetTrueFather())->nr]; // local copy of current bond partner of walker
     1049        OtherWalker = ListOfLocalAtoms[(*Runner)->GetOtherAtom((*iter)->GetTrueFather())->nr]; // local copy of current bond partner of walker
    10511050        if (OtherWalker != NULL) {
    10521051          if (OtherWalker->nr > (*iter)->nr)
    10531052            Leaf->AddBond((*iter), OtherWalker, (*Runner)->BondDegree);
    10541053        } else {
    1055           DoLog(1) && (Log() << Verbose(1) << "OtherWalker = ListOfLocalAtoms[" << FragmentCounter << "][" << (*Runner)->GetOtherAtom((*iter)->GetTrueFather())->nr << "] is NULL!" << endl);
     1054          DoLog(1) && (Log() << Verbose(1) << "OtherWalker = ListOfLocalAtoms[" << (*Runner)->GetOtherAtom((*iter)->GetTrueFather())->nr << "] is NULL!" << endl);
    10561055          status = false;
    10571056        }
     
    10621061  if ((FreeList) && (ListOfLocalAtoms != NULL)) {
    10631062    // free the index lookup list
    1064     delete[](ListOfLocalAtoms[FragmentCounter]);
    1065     if (FragmentCounter == 0) // first fragments frees the initial pointer to list
    1066       delete[](ListOfLocalAtoms);
     1063    delete[](ListOfLocalAtoms);
    10671064  }
    10681065  DoLog(1) && (Log() << Verbose(1) << "End of FillBondStructureFromReference." << endl);
     
    11101107/** Fills a lookup list of father's Atom::nr -> atom for each subgraph.
    11111108 * \param *out output stream from debugging
    1112  * \param ***ListOfLocalAtoms Lookup table for each subgraph and index of each atom in global molecule, may be NULL on start, then it is filled
    1113  * \param FragmentCounter counts the fragments as we move along the list
     1109 * \param **&ListOfLocalAtoms Lookup table for each subgraph and index of each atom in global molecule, may be NULL on start, then it is filled
    11141110 * \param GlobalAtomCount number of atoms in the complete molecule
    11151111 * \param &FreeList true - ***ListOfLocalAtoms is free'd before return, false - it is not
    1116  * \return true - success, false - failure
    1117  */
    1118 bool MoleculeLeafClass::FillListOfLocalAtoms(atom ***&ListOfLocalAtoms, const int FragmentCounter, const int GlobalAtomCount, bool &FreeList)
     1112 * \return true - success, false - failure (ListOfLocalAtoms != NULL)
     1113 */
     1114bool MoleculeLeafClass::FillListOfLocalAtoms(atom **&ListOfLocalAtoms, const int GlobalAtomCount, bool &FreeList)
    11191115{
    11201116  bool status = true;
    11211117
    1122   if (ListOfLocalAtoms == NULL) { // allocated initial pointer
    1123     // allocate and set each field to NULL
    1124     const int Counter = Count();
    1125     ASSERT(FragmentCounter < Counter, "FillListOfLocalAtoms: FragmenCounter greater than present fragments.");
    1126     ListOfLocalAtoms = new atom**[Counter];
    1127     if (ListOfLocalAtoms == NULL) {
    1128       FreeList = FreeList && false;
    1129       status = false;
    1130     }
    1131     for (int i=0;i<Counter;i++)
    1132       ListOfLocalAtoms[i] = NULL;
    1133   }
    1134 
    1135   if ((ListOfLocalAtoms != NULL) && (ListOfLocalAtoms[FragmentCounter] == NULL)) { // allocate and fill list of this fragment/subgraph
    1136     status = status && Leaf->CreateFatherLookupTable(ListOfLocalAtoms[FragmentCounter], GlobalAtomCount);
     1118  if (ListOfLocalAtoms == NULL) { // allocate and fill list of this fragment/subgraph
     1119    status = status && Leaf->CreateFatherLookupTable(ListOfLocalAtoms, GlobalAtomCount);
    11371120    FreeList = FreeList && true;
    1138   }
     1121  } else
     1122    return false;
    11391123
    11401124  return status;
     
    11581142  DoLog(1) && (Log() << Verbose(1) << "Begin of AssignKeySetsToFragment." << endl);
    11591143  // fill ListOfLocalAtoms if NULL was given
    1160   if (!FillListOfLocalAtoms(ListOfLocalAtoms, FragmentCounter, reference->getAtomCount(), FreeList)) {
     1144  if (!FillListOfLocalAtoms(ListOfLocalAtoms[FragmentCounter], reference->getAtomCount(), FreeList)) {
    11611145    DoLog(1) && (Log() << Verbose(1) << "Filling of ListOfLocalAtoms failed." << endl);
    11621146    return false;
     
    12031187    // free the index lookup list
    12041188    delete[](ListOfLocalAtoms[FragmentCounter]);
    1205     if (FragmentCounter == 0) // first fragments frees the initial pointer to list
    1206       delete[](ListOfLocalAtoms);
    12071189  }
    12081190  DoLog(1) && (Log() << Verbose(1) << "End of AssignKeySetsToFragment." << endl);
Note: See TracChangeset for help on using the changeset viewer.