]> granicus.if.org Git - re2c/commitdiff
Fixed occasional double-freeing tag names.
authorUlya Trofimovich <skvadrik@gmail.com>
Sun, 15 May 2016 16:49:52 +0000 (17:49 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Sun, 15 May 2016 16:49:52 +0000 (17:49 +0100)
Tag names belong to regexps, which may be shared between automata,
so names should be freed on regexp destruction, not on automata
destruction.

re2c/src/ir/regexp/regexp.h
re2c/src/ir/tag.cc
re2c/src/ir/tag.h

index 9440a74369406a9fe17978b9b3bc3a2001466cdb..1244a4d91d295e70c35d865902624bffb8bb238a 100644 (file)
@@ -80,6 +80,9 @@ struct RegExp
        inline ~RegExp()
        {
                flist.erase(this);
+               if (type == TAG) {
+                       delete tag;
+               }
        }
 
 private:
index b7a2bf3134ef286ee2657707cf46bcb6103bf0f4..6e49d7ead732a8c4c7772a6b9ad408cb43bbbd4f 100644 (file)
@@ -14,11 +14,6 @@ Tag::Tag()
        , name(NULL)
 {}
 
-Tag::~Tag()
-{
-       delete name;
-}
-
 void init_var_tag(Tag &tag, size_t r, const std::string *n, size_t o)
 {
        tag.type = Tag::VAR;
index bb193b48fd09d02ecf4099686257a0a4c74cb85b..bfe0ab4cc75177ea24cc63c0ccc7ac7e95b4c5d9 100644 (file)
@@ -29,7 +29,6 @@ struct Tag
        };
 
        Tag();
-       ~Tag();
        FORBID_COPY(Tag);
 };