Fixing a memory leak in CDInstMatchTrie::d_data.
authorTim King <taking@google.com>
Thu, 24 Mar 2016 18:21:31 +0000 (11:21 -0700)
committerTim King <taking@google.com>
Thu, 24 Mar 2016 18:21:31 +0000 (11:21 -0700)
src/theory/quantifiers/inst_match.cpp
src/theory/quantifiers/inst_match.h

index ead2bc57c4d19fa4927ddc42d485e5d540828c3d..f204fed4b7322d972bbf787fd21b80dc94d8cd28 100644 (file)
@@ -225,6 +225,15 @@ void InstMatchTrie::getInstantiations( std::vector< Node >& insts, Node q, std::
   }
 }
 
+CDInstMatchTrie::~CDInstMatchTrie() {
+  for(std::map< Node, CDInstMatchTrie* >::iterator i = d_data.begin(),
+          iend = d_data.end(); i != iend; ++i) {
+    CDInstMatchTrie* current = (*i).second;
+    delete current;
+  }
+  d_data.clear();
+}
+
 
 bool CDInstMatchTrie::addInstMatch( QuantifiersEngine* qe, Node f, std::vector< Node >& m,
                                     context::Context* c, bool modEq, bool modInst, int index, bool onlyExist ){
@@ -285,6 +294,7 @@ bool CDInstMatchTrie::addInstMatch( QuantifiersEngine* qe, Node f, std::vector<
     if( !onlyExist ){
       // std::map< Node, CDInstMatchTrie* >::iterator it = d_data.find( n );
       CDInstMatchTrie* imt = new CDInstMatchTrie( c );
+      Assert(d_data.find(n) == d_data.end());
       d_data[n] = imt;
       imt->addInstMatch( qe, f, m, c, modEq, modInst, index+1, false );
     }
index 35353863c267b02b8505e6c751912df051a243a8..7db59e88bdb31492fcaa751f86ec69cee0db0aa9 100644 (file)
@@ -96,7 +96,7 @@ public:
   public:
     std::vector< int > d_order;
   };/* class InstMatchTrie ImtIndexOrder */
-public:
+
   /** the data */
   std::map< Node, InstMatchTrie > d_data;
 private:
@@ -141,18 +141,18 @@ public:
 
 /** trie for InstMatch objects */
 class CDInstMatchTrie {
-public:
+private:
   /** the data */
   std::map< Node, CDInstMatchTrie* > d_data;
   /** is valid */
   context::CDO< bool > d_valid;
-private:
+
   void print( std::ostream& out, Node q, std::vector< TNode >& terms ) const;
   void getInstantiations( std::vector< Node >& insts, Node q, std::vector< Node >& terms, QuantifiersEngine * qe ) const;
 public:
   CDInstMatchTrie( context::Context* c ) : d_valid( c, false ){}
-  ~CDInstMatchTrie(){}
-public:
+  ~CDInstMatchTrie();
+
   /** return true if m exists in this trie
         modEq is if we check modulo equality
         modInst is if we return true if m is an instance of a match that exists