# HG changeset patch
# User Balazs Dezso <deba@inf.elte.hu>
# Date 1223233741 -7200
# Node ID 7c796c1cf1b094ce098b8a02a85336425c22c970
# Parent  cbe3ec2d59d2d7c539ab62f2ca6796c960795237
Fix memory leak hazard

If the constructor throws an exception, it should deallocate each
dynamically allocated memory.

diff -r cbe3ec2d59d2 -r 7c796c1cf1b0 lemon/lgf_reader.h
--- a/lemon/lgf_reader.h	Wed Oct 01 13:56:40 2008 +0200
+++ b/lemon/lgf_reader.h	Sun Oct 05 21:09:01 2008 +0200
@@ -517,7 +517,10 @@
         _filename(fn), _digraph(digraph),
         _use_nodes(false), _use_arcs(false),
         _skip_nodes(false), _skip_arcs(false) {
-      if (!(*_is)) throw IoError("Cannot open file", fn);
+      if (!(*_is)) {
+        delete _is;
+        throw IoError("Cannot open file", fn);
+      }
     }
 
     /// \brief Constructor
@@ -529,7 +532,10 @@
         _filename(fn), _digraph(digraph),
         _use_nodes(false), _use_arcs(false),
         _skip_nodes(false), _skip_arcs(false) {
-      if (!(*_is)) throw IoError("Cannot open file", fn);
+      if (!(*_is)) {
+        delete _is;
+        throw IoError("Cannot open file", fn);
+      }
     }
 
     /// \brief Destructor
@@ -1308,7 +1314,10 @@
         _filename(fn), _graph(graph),
         _use_nodes(false), _use_edges(false),
         _skip_nodes(false), _skip_edges(false) {
-      if (!(*_is)) throw IoError("Cannot open file", fn);
+      if (!(*_is)) {
+        delete _is;
+        throw IoError("Cannot open file", fn);
+      }
     }
 
     /// \brief Constructor
@@ -1320,7 +1329,10 @@
         _filename(fn), _graph(graph),
         _use_nodes(false), _use_edges(false),
         _skip_nodes(false), _skip_edges(false) {
-      if (!(*_is)) throw IoError("Cannot open file", fn);
+      if (!(*_is)) {
+        delete _is;
+        throw IoError("Cannot open file", fn);
+      }
     }
 
     /// \brief Destructor
@@ -2094,7 +2106,10 @@
     SectionReader(const std::string& fn)
       : _is(new std::ifstream(fn.c_str())), local_is(true),
         _filename(fn) {
-      if (!(*_is)) throw IoError("Cannot open file", fn);
+      if (!(*_is)) {
+        delete _is;
+        throw IoError("Cannot open file", fn);
+      }
     }
 
     /// \brief Constructor
@@ -2103,7 +2118,10 @@
     SectionReader(const char* fn)
       : _is(new std::ifstream(fn)), local_is(true),
         _filename(fn) {
-      if (!(*_is)) throw IoError("Cannot open file", fn);
+      if (!(*_is)) {
+        delete _is;
+        throw IoError("Cannot open file", fn);
+      }
     }
 
     /// \brief Destructor
@@ -2386,7 +2404,10 @@
     /// file.
     LgfContents(const std::string& fn)
       : _is(new std::ifstream(fn.c_str())), local_is(true) {
-      if (!(*_is)) throw IoError("Cannot open file", fn);
+      if (!(*_is)) {
+        delete _is;
+        throw IoError("Cannot open file", fn);
+      }
     }
 
     /// \brief Constructor
@@ -2395,7 +2416,10 @@
     /// file.
     LgfContents(const char* fn)
       : _is(new std::ifstream(fn)), local_is(true) {
-      if (!(*_is)) throw IoError("Cannot open file", fn);
+      if (!(*_is)) {
+        delete _is;
+        throw IoError("Cannot open file", fn);
+      }
     }
 
     /// \brief Destructor
diff -r cbe3ec2d59d2 -r 7c796c1cf1b0 lemon/lgf_writer.h
--- a/lemon/lgf_writer.h	Wed Oct 01 13:56:40 2008 +0200
+++ b/lemon/lgf_writer.h	Sun Oct 05 21:09:01 2008 +0200
@@ -463,7 +463,10 @@
     DigraphWriter(const Digraph& digraph, const std::string& fn)
       : _os(new std::ofstream(fn.c_str())), local_os(true), _digraph(digraph),
         _skip_nodes(false), _skip_arcs(false) {
-      if (!(*_os)) throw IoError("Cannot write file", fn);
+      if (!(*_os)) {
+        delete _os;
+        throw IoError("Cannot write file", fn);
+      }
     }
 
     /// \brief Constructor
@@ -473,7 +476,10 @@
     DigraphWriter(const Digraph& digraph, const char* fn)
       : _os(new std::ofstream(fn)), local_os(true), _digraph(digraph),
         _skip_nodes(false), _skip_arcs(false) {
-      if (!(*_os)) throw IoError("Cannot write file", fn);
+      if (!(*_os)) {
+        delete _os;
+        throw IoError("Cannot write file", fn);
+      }
     }
 
     /// \brief Destructor
@@ -1024,7 +1030,10 @@
     GraphWriter(const Graph& graph, const std::string& fn)
       : _os(new std::ofstream(fn.c_str())), local_os(true), _graph(graph),
         _skip_nodes(false), _skip_edges(false) {
-      if (!(*_os)) throw IoError("Cannot write file", fn);
+      if (!(*_os)) {
+        delete _os;
+        throw IoError("Cannot write file", fn);
+      }
     }
 
     /// \brief Constructor
@@ -1034,7 +1043,10 @@
     GraphWriter(const Graph& graph, const char* fn)
       : _os(new std::ofstream(fn)), local_os(true), _graph(graph),
         _skip_nodes(false), _skip_edges(false) {
-      if (!(*_os)) throw IoError("Cannot write file", fn);
+      if (!(*_os)) {
+        delete _os;
+        throw IoError("Cannot write file", fn);
+      }
     }
 
     /// \brief Destructor
@@ -1587,7 +1599,10 @@
     /// Construct a section writer, which writes into the given file.
     SectionWriter(const std::string& fn)
       : _os(new std::ofstream(fn.c_str())), local_os(true) {
-      if (!(*_os)) throw IoError("Cannot write file", fn);
+      if (!(*_os)) {
+        delete _os;
+        throw IoError("Cannot write file", fn);
+      }
     }
 
     /// \brief Constructor
@@ -1595,7 +1610,10 @@
     /// Construct a section writer, which writes into the given file.
     SectionWriter(const char* fn)
       : _os(new std::ofstream(fn)), local_os(true) {
-      if (!(*_os)) throw IoError("Cannot write file", fn);
+      if (!(*_os)) {
+        delete _os;
+        throw IoError("Cannot write file", fn);
+      }
     }
 
     /// \brief Destructor