# HG changeset patch # User Balazs Dezso # 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