Fix mempool merge conflict.
diff --git a/heron/common/src/cpp/basics/mempool.cpp b/heron/common/src/cpp/basics/mempool.cpp
index d581806..5705f8c 100644
--- a/heron/common/src/cpp/basics/mempool.cpp
+++ b/heron/common/src/cpp/basics/mempool.cpp
@@ -17,7 +17,6 @@
 ////////////////////////////////////////////////////////////////////////////////
 // Just defines the static member of Mempool class
 ////////////////////////////////////////////////////////////////////////////////
-#include "basics/mempool.h"
 #include "basics/basics.h"
 #include "glog/logging.h"
 
diff --git a/heron/common/src/cpp/basics/mempool.h b/heron/common/src/cpp/basics/mempool.h
index eb3ff7e..fd7de19 100644
--- a/heron/common/src/cpp/basics/mempool.h
+++ b/heron/common/src/cpp/basics/mempool.h
@@ -21,34 +21,7 @@
 #include <unordered_map>
 #include <mutex>
 #include <typeindex>
-
-template<typename T>
-class BaseMemPool {
- public:
-  template<class... Args>
-  T* acquire(Args&&... args) {
-    if (pool_.empty()) {
-      return new T(std::forward<Args>(args)...);
-    }
-    T* t = pool_.back();
-    pool_.pop_back();
-    return t;
-  }
-  void release(T* t) {
-    pool_.push_back(t);
-  }
-  BaseMemPool() {
-  }
-  ~BaseMemPool() {
-      for (auto& p : pool_) {
-        delete p;
-      }
-      pool_.clear();
-  }
- private:
-  std::vector<T*> pool_;
-};
-
+#include "basics/basics.h"
 
 template<typename B>
 class MemPool {
@@ -56,21 +29,25 @@
   MemPool() {
   }
 
+  explicit MemPool(sp_int32 _pool_limit) :
+    pool_limit_(_pool_limit) {
+  }
+
   // TODO(cwang): we have a memory leak here.
   ~MemPool() {
-    for (auto& m : map_) {
-      for (auto& n : m.second) {
-        delete n;
+    for (auto& map_iter : mem_pool_map_) {
+      for (auto& mem_pool : map_iter.second) {
+        delete mem_pool;
       }
-      m.second.clear();
+      map_iter.second.clear();
     }
-    map_.clear();
+    mem_pool_map_.clear();
   }
 
   template<typename M>
   M* acquire(M* m) {
     std::type_index type = typeid(M);
-    std::vector<B*>& pool = map_[type];
+    std::vector<B*>& pool = mem_pool_map_[type];
 
     if (pool.empty()) {
       return new M();
@@ -83,7 +60,6 @@
   template<typename M>
   void release(M* ptr) {
     std::type_index type = typeid(M);
-    map_[type].push_back(static_cast<B*>(ptr));
     sp_int32 size = mem_pool_map_[type].size();
     // if pool size reaches the limit, release the memory
     // otherwise put the memory into pool
@@ -111,7 +87,9 @@
 template<typename T>
 T* __global_protobuf_pool_acquire__(T* _m) {
   std::lock_guard<std::mutex> guard(__global_protobuf_pool_mutex__);
-  return __global_protobuf_pool__->acquire(_m);
+  T* t = __global_protobuf_pool__->acquire(_m);
+  t->Clear();
+  return t;
 }
 
 template<typename T>