Fix memory leak in bvminisat (#1710)
authorAndres Noetzli <andres.noetzli@gmail.com>
Mon, 26 Mar 2018 19:34:05 +0000 (12:34 -0700)
committerGitHub <noreply@github.com>
Mon, 26 Mar 2018 19:34:05 +0000 (12:34 -0700)
While reviewing #1695, I realized that bvminisat is leaking memory for
each call to setNotify(). This commit uses std::unique_ptr to fix the
issue. It also adds std::unique_ptr to manage d_minisat.

src/prop/bvminisat/bvminisat.cpp
src/prop/bvminisat/bvminisat.h

index e3632c08d386f0858f755c0827ab6e35fad13872..2aefbf11ebcb52098ce0607024dc307d5f11bd05 100644 (file)
@@ -27,19 +27,17 @@ namespace prop {
 BVMinisatSatSolver::BVMinisatSatSolver(StatisticsRegistry* registry, context::Context* mainSatContext, const std::string& name)
 : context::ContextNotifyObj(mainSatContext, false),
   d_minisat(new BVMinisat::SimpSolver(mainSatContext)),
-  d_minisatNotify(0),
+  d_minisatNotify(nullptr),
   d_assertionsCount(0),
   d_assertionsRealCount(mainSatContext, 0),
   d_lastPropagation(mainSatContext, 0),
   d_statistics(registry, name)
 {
-  d_statistics.init(d_minisat);
+  d_statistics.init(d_minisat.get());
 }
 
 
 BVMinisatSatSolver::~BVMinisatSatSolver() {
-  delete d_minisat;
-  delete d_minisatNotify;
 }
 
 void BVMinisatSatSolver::MinisatNotify::notify(
@@ -54,8 +52,8 @@ void BVMinisatSatSolver::MinisatNotify::notify(
 }
 
 void BVMinisatSatSolver::setNotify(Notify* notify) {
-  d_minisatNotify = new MinisatNotify(notify);
-  d_minisat->setNotify(d_minisatNotify);
+  d_minisatNotify.reset(new MinisatNotify(notify));
+  d_minisat->setNotify(d_minisatNotify.get());
 }
 
 ClauseId BVMinisatSatSolver::addClause(SatClause& clause,
index 4395cdf6ddc309269fd1940bc42adaefea2665d9..6081296cbae3c6a088d116eecac750ed0adcadd6 100644 (file)
@@ -18,6 +18,8 @@
 
 #pragma once
 
+#include <memory>
+
 #include "context/cdo.h"
 #include "proof/clause_id.h"
 #include "prop/bvminisat/simp/SimpSolver.h"
@@ -49,8 +51,8 @@ class BVMinisatSatSolver : public BVSatSolverInterface,
     void safePoint(unsigned amount) override { d_notify->safePoint(amount); }
   };
 
-  BVMinisat::SimpSolver* d_minisat;
-  MinisatNotify* d_minisatNotify;
+       std::unique_ptr<BVMinisat::SimpSolver> d_minisat;
+       std::unique_ptr<MinisatNotify> d_minisatNotify;
 
   unsigned d_assertionsCount;
   context::CDO<unsigned> d_assertionsRealCount;