diff --git a/shared/cplusplus/AST.cpp b/shared/cplusplus/AST.cpp
index 248ed13a02789a8b23f70b2db6b5a7233dfb049b..7774d4d71fa8cbd9abd69bbb3472f891045bc4a8 100644
--- a/shared/cplusplus/AST.cpp
+++ b/shared/cplusplus/AST.cpp
@@ -381,15 +381,6 @@ UsingDirectiveAST *AST::asUsingDirective()
 WhileStatementAST *AST::asWhileStatement()
 { return dynamic_cast<WhileStatementAST *>(this); }
 
-void *AST::operator new(size_t size, MemoryPool *pool)
-{ return pool->allocate(size); }
-
-void AST::operator delete(void *)
-{ }
-
-void AST::operator delete(void *, MemoryPool *)
-{ }
-
 void AST::accept(ASTVisitor *visitor)
 {
     if (visitor->preVisit(this))
diff --git a/shared/cplusplus/AST.h b/shared/cplusplus/AST.h
index fd7cec40deb9cf73e60eaf87edc129721203a75e..c4b0f7fe76ff05b597d0ed3582d08e9ff02fab69 100644
--- a/shared/cplusplus/AST.h
+++ b/shared/cplusplus/AST.h
@@ -55,12 +55,12 @@
 
 #include "CPlusPlusForwardDeclarations.h"
 #include "ASTfwd.h"
-#include <new>
+#include "MemoryPool.h"
 
 CPLUSPLUS_BEGIN_HEADER
 CPLUSPLUS_BEGIN_NAMESPACE
 
-class CPLUSPLUS_EXPORT AST
+class CPLUSPLUS_EXPORT AST: public Managed
 {
     AST(const AST &other);
     void operator =(const AST &other);
@@ -74,10 +74,6 @@ public:
     static void accept(AST *ast, ASTVisitor *visitor)
     { if (ast) ast->accept(visitor); }
 
-    void *operator new(size_t size, MemoryPool *pool);
-    void operator delete(void *);
-    void operator delete(void *, MemoryPool *);
-
     virtual unsigned firstToken() const = 0;
     virtual unsigned lastToken() const = 0;
 
diff --git a/shared/cplusplus/MemoryPool.cpp b/shared/cplusplus/MemoryPool.cpp
index 639bb2c6164eaf1fab135f090c79b15f9fad5654..a7c04691449d85ded3f11ceebb1a4c7c60a7d86e 100644
--- a/shared/cplusplus/MemoryPool.cpp
+++ b/shared/cplusplus/MemoryPool.cpp
@@ -112,4 +112,19 @@ void *MemoryPool::allocate_helper(size_t size)
     return addr;
 }
 
+Managed::Managed()
+{ }
+
+Managed::~Managed()
+{ }
+
+void *Managed::operator new(size_t size, MemoryPool *pool)
+{ return pool->allocate(size); }
+
+void Managed::operator delete(void *)
+{ }
+
+void Managed::operator delete(void *, MemoryPool *)
+{ }
+
 CPLUSPLUS_END_NAMESPACE
diff --git a/shared/cplusplus/MemoryPool.h b/shared/cplusplus/MemoryPool.h
index 8d1f09b54e804598d731aad53da32fffce518b59..9647b673a6e3a8e7b47e2340c784cef86d1cf9b8 100644
--- a/shared/cplusplus/MemoryPool.h
+++ b/shared/cplusplus/MemoryPool.h
@@ -55,6 +55,7 @@
 
 #include "CPlusPlusForwardDeclarations.h"
 #include <cstddef>
+#include <new>
 
 CPLUSPLUS_BEGIN_HEADER
 CPLUSPLUS_BEGIN_NAMESPACE
@@ -99,6 +100,20 @@ private:
     };
 };
 
+class CPLUSPLUS_EXPORT Managed
+{
+    Managed(const Managed &other);
+    void operator = (const Managed &other);
+
+public:
+    Managed();
+    virtual ~Managed();
+
+    void *operator new(size_t size, MemoryPool *pool);
+    void operator delete(void *);
+    void operator delete(void *, MemoryPool *);
+};
+
 CPLUSPLUS_END_NAMESPACE
 CPLUSPLUS_END_HEADER