Added PtrCloser guards for constructNodePtr. This ensures garbage collection on type...
authorTim King <taking@google.com>
Thu, 10 Nov 2016 17:40:23 +0000 (09:40 -0800)
committerTim King <taking@google.com>
Thu, 10 Nov 2016 17:40:23 +0000 (09:40 -0800)
src/expr/node_builder.h

index 0dd4e44e8bfd5e023b9919fe30664ad38f55b1e1..d92524a1962389232198d838a79895da731ae94d 100644 (file)
@@ -171,6 +171,7 @@ namespace CVC4 {
 
 #include "base/cvc4_assert.h"
 #include "base/output.h"
+#include "base/ptr_closer.h"
 #include "expr/kind.h"
 #include "expr/metakind.h"
 #include "expr/node_value.h"
@@ -887,16 +888,18 @@ Node NodeBuilder<nchild_thresh>::constructNode() const {
 
 template <unsigned nchild_thresh>
 Node* NodeBuilder<nchild_thresh>::constructNodePtr() {
-  Node *np = new Node(constructNV());
-  maybeCheckType(*np);
-  return np;
+  // maybeCheckType() can throw an exception. Make sure to call the destructor
+  // on the exception branch.
+  PtrCloser<Node> np(new Node(constructNV()));
+  maybeCheckType(*np.get());
+  return np.release();
 }
 
 template <unsigned nchild_thresh>
 Node* NodeBuilder<nchild_thresh>::constructNodePtr() const {
-  Node *np = new Node(constructNV());
-  maybeCheckType(*np);
-  return np;
+  PtrCloser<Node> np(new Node(constructNV()));
+  maybeCheckType(*np.get());
+  return np.release();
 }
 
 template <unsigned nchild_thresh>