[PPL-devel] [GIT] ppl/ppl(sparse_matrices): Memory leaks fixed.

Roberto Bagnara bagnara at cs.unipr.it
Sat Dec 25 08:55:20 CET 2010


Module: ppl/ppl
Branch: sparse_matrices
Commit: bae9231e876e264a8d973ad22ef465f0a1829e02
URL:    http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=bae9231e876e264a8d973ad22ef465f0a1829e02

Author: Roberto Bagnara <bagnara at cs.unipr.it>
Date:   Fri Dec 24 11:59:17 2010 +0100

Memory leaks fixed.
(Patch by Marco Poletti.)

---

 src/MIP_Problem.templates.hh |   82 ++++++++++++++++++++++++++----------------
 1 files changed, 51 insertions(+), 31 deletions(-)

diff --git a/src/MIP_Problem.templates.hh b/src/MIP_Problem.templates.hh
index 8997ad3..4b54b9e 100644
--- a/src/MIP_Problem.templates.hh
+++ b/src/MIP_Problem.templates.hh
@@ -77,22 +77,32 @@ MIP_Problem::MIP_Problem(const dimension_type dim,
     throw std::invalid_argument(s.str());
   }
   // Check the constraints.
-  for (In i = first; i != last; ++i) {
-    if (i->is_strict_inequality())
-      throw std::invalid_argument("PPL::MIP_Problem::"
-                                  "MIP_Problem(dim, first, last, int_vars,"
-                                  "obj, mode):\nrange [first, last) contains"
-                                  "a strict inequality constraint.");
-    if (i->space_dimension() > dim) {
-      std::ostringstream s;
-      s << "PPL::MIP_Problem::"
-        << "MIP_Problem(dim, first, last, int_vars, obj, mode):\n"
-        << "range [first, last) contains a constraint having space"
-        << "dimension  == " << i->space_dimension() << " that exceeds"
-        "this->space_dimension == " << dim << ".";
-      throw std::invalid_argument(s.str());
+  try {
+    for (In i = first; i != last; ++i) {
+      if (i->is_strict_inequality())
+        throw std::invalid_argument("PPL::MIP_Problem::"
+                                    "MIP_Problem(dim, first, last, int_vars,"
+                                    "obj, mode):\nrange [first, last) contains"
+                                    "a strict inequality constraint.");
+      if (i->space_dimension() > dim) {
+        std::ostringstream s;
+        s << "PPL::MIP_Problem::"
+          << "MIP_Problem(dim, first, last, int_vars, obj, mode):\n"
+          << "range [first, last) contains a constraint having space"
+          << "dimension  == " << i->space_dimension() << " that exceeds"
+          "this->space_dimension == " << dim << ".";
+        throw std::invalid_argument(s.str());
+      }
+      add_constraint_helper(*i);
     }
-    add_constraint_helper(*i);
+  } catch (...) {
+    // Delete the allocated constraints, to avoid memory leaks.
+
+    for (Constraint_Sequence::const_iterator
+          i = input_cs.begin(), i_end = input_cs.end(); i != i_end; ++i)
+      delete *i;
+
+    throw;
   }
   PPL_ASSERT(OK());
 }
@@ -134,23 +144,33 @@ MIP_Problem::MIP_Problem(dimension_type dim,
     throw std::invalid_argument(s.str());
   }
   // Check the constraints.
-  for (In i = first; i != last; ++i) {
-    if (i->is_strict_inequality())
-      throw std::invalid_argument("PPL::MIP_Problem::"
-                                  "MIP_Problem(dim, first, last, obj, mode):"
-                                  "\n"
-                                  "range [first, last) contains a strict "
-                                  "inequality constraint.");
-    if (i->space_dimension() > dim) {
-      std::ostringstream s;
-      s << "PPL::MIP_Problem::"
-        << "MIP_Problem(dim, first, last, obj, mode):\n"
-        << "range [first, last) contains a constraint having space"
-        << "dimension" << " == " << i->space_dimension() << " that exceeds"
-        "this->space_dimension == " << dim << ".";
-      throw std::invalid_argument(s.str());
+  try {
+    for (In i = first; i != last; ++i) {
+      if (i->is_strict_inequality())
+        throw std::invalid_argument("PPL::MIP_Problem::"
+                                    "MIP_Problem(dim, first, last, obj, mode):"
+                                    "\n"
+                                    "range [first, last) contains a strict "
+                                    "inequality constraint.");
+      if (i->space_dimension() > dim) {
+        std::ostringstream s;
+        s << "PPL::MIP_Problem::"
+          << "MIP_Problem(dim, first, last, obj, mode):\n"
+          << "range [first, last) contains a constraint having space"
+          << "dimension" << " == " << i->space_dimension() << " that exceeds"
+          "this->space_dimension == " << dim << ".";
+        throw std::invalid_argument(s.str());
+      }
+      add_constraint_helper(*i);
     }
-    add_constraint_helper(*i);
+  } catch (...) {
+    // Delete the allocated constraints, to avoid memory leaks.
+
+    for (Constraint_Sequence::const_iterator
+          i = input_cs.begin(), i_end = input_cs.end(); i != i_end; ++i)
+      delete *i;
+
+    throw;
   }
   PPL_ASSERT(OK());
 }




More information about the PPL-devel mailing list