diff --git a/include/memory-faucet.h b/include/memory-faucet.h
index f4c5ba8d249a9ef8336895a99c254e319468b8a1..97d806f8e87d7bf3c992b1064c1ef59bf09d95d6 100644
--- a/include/memory-faucet.h
+++ b/include/memory-faucet.h
@@ -36,7 +36,10 @@ private:
 
 public:
     memBuf(const size_t required_size);
+    memBuf();
     ~memBuf();
     void* ptr();
+    void free_memory();
     int get_size() const;
+    void get_memory(const size_t required_size);
 };
\ No newline at end of file
diff --git a/src/memory-faucet.cpp b/src/memory-faucet.cpp
index 21d734c94dda92c8cc997e089cb64a00c2f2f697..32fc36788652826792bdb75796b2856e3118fae9 100644
--- a/src/memory-faucet.cpp
+++ b/src/memory-faucet.cpp
@@ -67,13 +67,24 @@ memBuf<mem, choose_type>::memBuf(const size_t required_size)
 }
 
 template< MemType mem, buf_choose_policy choose_type >
-memBuf<mem, choose_type>::~memBuf()
+void memBuf<mem, choose_type>::free_memory()
 {
+    if(id == -1)
+    {
+        return;
+    }
+
     memory_pipe<mem, choose_type>& mem_pipe = memory_faucet::get_faucet<mem, choose_type>();
     mem_pipe.set_available(id);
     buf = nullptr;
 }
 
+template< MemType mem, buf_choose_policy choose_type >
+memBuf<mem, choose_type>::~memBuf()
+{
+    free_memory();
+}
+
 template< MemType mem, buf_choose_policy choose_type >
 void* memBuf<mem, choose_type>::ptr()
 {
@@ -86,6 +97,24 @@ int memBuf<mem, choose_type>::get_size() const
     return size;
 }
 
+template< MemType mem, buf_choose_policy choose_type >
+memBuf<mem, choose_type>::memBuf() 
+{
+    buf = nullptr;
+    id = -1;
+    size = 0;
+}
+
+template< MemType mem, buf_choose_policy choose_type >
+void memBuf<mem, choose_type>::get_memory(const size_t required_size) 
+{
+    free_memory();
+
+    memory_pipe<mem, choose_type>& mem_pipe = memory_faucet::get_faucet<mem, choose_type>();
+    id = mf_utils::get_buffer<choose_type>(required_size, mem_pipe.get_buff_vec(), mem, &buf);
+    size = required_size;
+}
+
 template class memBuf<MemType::CPU, buf_choose_policy::naive>;
 template class memBuf<MemType::CPU, buf_choose_policy::sorted_vec>;
 template class memBuf<MemType::CPU, buf_choose_policy::find_best_unsorted>;