From 90b45594fe9169133634edce19301273bbd72320 Mon Sep 17 00:00:00 2001
From: Stefan Bienert <stefan.bienert@unibas.ch>
Date: Tue, 17 May 2011 15:59:12 +0200
Subject: [PATCH] Fixed BZDNG-246; modified AtomImpl::DeleteAllTorsions() and
 test_view/ test_delete which produced a memeory leak.

---
 modules/mol/base/src/impl/atom_impl.cc | 19 ++++++++++---------
 modules/mol/base/tests/test_delete.cc  |  2 +-
 modules/mol/base/tests/test_view.cc    |  6 +++---
 3 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/modules/mol/base/src/impl/atom_impl.cc b/modules/mol/base/src/impl/atom_impl.cc
index 3339ead62..bf66239bb 100644
--- a/modules/mol/base/src/impl/atom_impl.cc
+++ b/modules/mol/base/src/impl/atom_impl.cc
@@ -356,20 +356,21 @@ String AtomImpl::GetStringProperty(Prop::ID prop_id) const
 void AtomImpl::DeleteAllTorsions() {
   EntityImplPtr e=this->GetEntity();
   TorsionImplMap::iterator i;
-  while (true) {
-    for (i=e->GetTorsionMap().begin(); i!=e->GetTorsionMap().end(); ++i) {
-      if (i->second->IsAtomInvolved(shared_from_this())) {
-        e->GetTorsionMap().erase(i);
-        continue;
-      }
-    }
-    break;
+  std::vector<TorsionImplMap::iterator> t_rm_vec;
+  for (i=e->GetTorsionMap().begin(); i!=e->GetTorsionMap().end(); ++i) {
+     if (i->second->IsAtomInvolved(shared_from_this())) {
+        t_rm_vec.push_back(i);
+     }
+  }
+  std::vector<TorsionImplMap::iterator>::iterator it_rm;
+  for (it_rm=t_rm_vec.begin(); it_rm!=t_rm_vec.end(); ++it_rm) {
+     e->GetTorsionMap().erase(*it_rm);
   }
   TorsionImplList& l=this->GetResidue()->GetTorsionList();
   TorsionImplList::iterator j;
   j=std::remove_if(l.begin(), l.end(),
                    bind(&TorsionImpl::IsAtomInvolved, _1, shared_from_this()));
-   l.erase(j, l.end());
+  l.erase(j, l.end());
 }
 
 }}} // ns
diff --git a/modules/mol/base/tests/test_delete.cc b/modules/mol/base/tests/test_delete.cc
index 4a361afc9..ccbce7045 100644
--- a/modules/mol/base/tests/test_delete.cc
+++ b/modules/mol/base/tests/test_delete.cc
@@ -77,4 +77,4 @@ BOOST_AUTO_TEST_CASE(atom_delete)
   BOOST_CHECK_NO_THROW(f.e.Apply(ev));
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/modules/mol/base/tests/test_view.cc b/modules/mol/base/tests/test_view.cc
index ebfdf10bb..cfe3a395c 100644
--- a/modules/mol/base/tests/test_view.cc
+++ b/modules/mol/base/tests/test_view.cc
@@ -27,8 +27,8 @@
 using namespace ost;
 using namespace ost::mol;
 
-struct Fixture {
-  Fixture() {
+struct FixtureView {
+  FixtureView() {
     e=CreateEntity();
     XCSEditor editor=e.EditXCS();
     c=editor.InsertChain("A");
@@ -54,7 +54,7 @@ BOOST_AUTO_TEST_SUITE( mol_base )
 
 BOOST_AUTO_TEST_CASE(gen_full_view) 
 {
-  Fixture f;
+  FixtureView f;
 
   EntityView ev = f.e.CreateFullView();
   BOOST_CHECK_EQUAL(ev.GetChainCount(),f.e.GetChainCount());
-- 
GitLab