]> granicus.if.org Git - re2c/commitdiff
Fixed memleaks (skeleton nodes were not destructed properly).
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 9 Sep 2015 15:26:28 +0000 (16:26 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 9 Sep 2015 15:26:28 +0000 (16:26 +0100)
Found with 'make vtests'

re2c/src/codegen/skeleton/skeleton.cc
re2c/src/codegen/skeleton/skeleton.h

index 818964538baf5f48cf5af9744762bf19d1d10b00..313e4507ba4d46d571324270691c858f8e9017a7 100644 (file)
@@ -1,16 +1,18 @@
 #include "src/codegen/skeleton/skeleton.h"
 #include "src/ir/regexp/regexp_rule.h"
-#include "src/util/allocate.h"
 
 namespace re2c
 {
 
-Node::Node (const State * s, const s2n_map & s2n)
+Node::Node ()
        : arcs ()
        , arcsets ()
        , loop (0)
        , rule (rule_rank_t::none ())
        , suffix (NULL)
+{}
+
+void Node::init (const State * s, const s2n_map & s2n)
 {
        const bool is_accepting = s && s->rule;
        if (is_accepting)
@@ -50,7 +52,7 @@ bool Node::end () const
 
 Skeleton::Skeleton (const DFA & dfa)
        // +1 for default DFA state (NULL)
-       : nodes (allocate<Node> (dfa.nStates + 1))
+       : nodes (new Node [dfa.nStates + 1])
 {
        Node * n;
 
@@ -67,14 +69,14 @@ Skeleton::Skeleton (const DFA & dfa)
        n = nodes;
        for (State * s = dfa.head; s; s = s->next, ++n)
        {
-               new (n) Node (s, s2n);
+               n->init (s, s2n);
        }
-       new (n) Node (NULL, s2n);
+       n->init (NULL, s2n);
 }
 
 Skeleton::~Skeleton ()
 {
-       operator delete (nodes);
+       delete [] nodes;
 }
 
 } // namespace re2c
index ef11f470def8a21c2258ab7ff54caf4dce516b0b..1981ead2ca497bef0b3ab940d0f10c58245f718b 100644 (file)
@@ -38,7 +38,8 @@ struct Node
        // path to end node (for constructing path cover)
        path_t * suffix;
 
-       Node (const State * s, const s2n_map & s2n);
+       Node ();
+       void init (const State * s, const s2n_map & s2n);
        ~Node ();
        bool end () const;
        arccount_t sizeof_permutate (arccount_t inarcs, arccount_t len);