diff --git a/mem_pool.h b/mem_pool.h
index ae92841..1b43c97 100644
--- a/mem_pool.h
+++ b/mem_pool.h
@@ -24,4 +24,17 @@ struct Mem_Block {
     ~Mem_Block() {}
 };

+class Mem_Pool {
+public:
+    Mem_Pool(uint32_t n_Mem_Page_Size, uint32_t n_Mem_Page_Num = 1024, uint32_t n_Mem_Page_Expend_Num = 256);
+    ~Mem_Pool();
+    void *alloc_Mem(void);
+    void free_Mem(void* ptr);
+private:
+    Mem_Block *p_Mem_Block;
+    uint32_t n_Mem_Page_Size;
+    uint32_t n_Mem_Page_Num;
+    uint32_t n_Mem_Page_Expend_Num;
+};
+
 #endif
diff --git a/mem_pool.cpp b/mem_pool.cpp
index e69de29..e88b5d6 100644
--- a/mem_pool.cpp
+++ b/mem_pool.cpp
@@ -0,0 +1,16 @@
+#include "MemPool.h"
+
+const uint32_t MEMPAGE_STANDARD_ALIGNMENT = 4;
+const uint32_t MEMPOOL_ALIGNMENT = 16;
+
+Mem_Pool::Mem_Pool(uint32_t _n_Mem_Page_Size, uint32_t _n_Mem_Page_Num, uint32_t _n_Mem_Page_Expend_Num) {
+    p_Mem_Block = NULL;
+    n_Mem_Page_Num = _n_Mem_Page_Num;
+    n_Mem_Page_Expend_Num = _n_Mem_Page_Expend_Num;
+
+    if (_n_Mem_Page_Size > MEMPAGE_STANDARD_ALIGNMENT) {
+        n_Mem_Page_Size = (_n_Mem_Page_Size + (MEMPOOL_ALIGNMENT - 1)) & ~(MEMPOOL_ALIGNMENT - 1);
+    } else {
+        n_Mem_Page_Size = MEMPAGE_STANDARD_ALIGNMENT;
+    }
+}
diff --git a/mem_pool.cpp b/mem_pool.cpp
index e69de29..e88b5d6 100644
--- a/mem_pool.cpp
+++ b/mem_pool.cpp
@@ -0,0 +1,16 @@
+#include "MemPool.h"
+
+const uint32_t MEMPAGE_STANDARD_ALIGNMENT = 4;
+const uint32_t MEMPOOL_ALIGNMENT = 16;
+
+Mem_Pool::Mem_Pool(uint32_t _n_Mem_Page_Size, uint32_t _n_Mem_Page_Num, uint32_t _n_Mem_Page_Expend_Num) {
+    p_Mem_Block = NULL;
+    n_Mem_Page_Num = _n_Mem_Page_Num;
+    n_Mem_Page_Expend_Num = _n_Mem_Page_Expend_Num;
+
+    if (_n_Mem_Page_Size > MEMPAGE_STANDARD_ALIGNMENT) {
+        n_Mem_Page_Size = (_n_Mem_Page_Size + (MEMPOOL_ALIGNMENT - 1)) & ~(MEMPOOL_ALIGNMENT - 1);
+    } else {
+        n_Mem_Page_Size = MEMPAGE_STANDARD_ALIGNMENT;
+    }
+}
diff --git a/mem_pool.cpp b/mem_pool.cpp
index e88b5d6..496a570 100644
--- a/mem_pool.cpp
+++ b/mem_pool.cpp
@@ -14,3 +14,36 @@ Mem_Pool::Mem_Pool(uint32_t _n_Mem_Page_Size, uint32_t _n_Mem_Page_Num, uint32_t
         n_Mem_Page_Size = MEMPAGE_STANDARD_ALIGNMENT;
     }
 }
+
+void* Mem_Pool::alloc_Mem(void) {
+    if (!p_Mem_Block) {
+        p_Mem_Block = new(n_Mem_Page_Num, n_Mem_Page_Size) Mem_Block(n_Mem_Page_Num, n_Mem_Page_Size);
+        return (void*)p_Mem_Block->data_Region;
+    }
+
+    Mem_Block *p_Iter_Mem_Block = p_Mem_Block;
+    while (p_Iter_Mem_Block && !p_Iter_Mem_Block->n_Free_Mem_Page_Num) {
+        p_Iter_Mem_Block = p_Iter_Mem_Block->p_Next_Mem_Block;
+    }
+
+    if (p_Iter_Mem_Block) {
+        char *p_Free_Mem_Page = p_Iter_Mem_Block->data_Region + (p_Iter_Mem_Block->n_First_Free_Mem_Page_ID * n_Mem_Page_Size);
+        p_Iter_Mem_Block->n_First_Free_Mem_Page_ID = *((uint32_t*)p_Free_Mem_Page);
+        p_Iter_Mem_Block->n_Free_Mem_Page_Num--;
+        return (void*)p_Free_Mem_Page;
+    } else {
+        if (!n_Mem_Page_Expend_Num) {
+            return NULL;
+        }
+
+        p_Iter_Mem_Block = new(n_Mem_Page_Expend_Num, n_Mem_Page_Size) Mem_Block(n_Mem_Page_Expend_Num, n_Mem_Page_Size);
+        if (!p_Iter_Mem_Block) {
+            return NULL;
+        }
+
+        p_Iter_Mem_Block->p_Next_Mem_Block = p_Mem_Block;
+        p_Mem_Block = p_Iter_Mem_Block;
+
+        return (void*)(p_Iter_Mem_Block->data_Region);
+    }
+}
diff --git a/mem_pool.cpp b/mem_pool.cpp
index 496a570..6b382e7 100644
--- a/mem_pool.cpp
+++ b/mem_pool.cpp
@@ -47,3 +47,36 @@ void* Mem_Pool::alloc_Mem(void) {
         return (void*)(p_Iter_Mem_Block->data_Region);
     }
 }
+
+void Mem_Pool::free_Mem(void *ptr) {
+    Mem_Block *p_Iter_Mem_Block = p_Mem_Block;
+    Mem_Block *p_Pre_Iter_Mem_Block = NULL;
+
+    while (((uint32_t*)ptr < (uint32_t*)p_Iter_Mem_Block->data_Region) ||
+           ((uint32_t*)ptr >= ((uint32_t*)p_Iter_Mem_Block->data_Region + p_Iter_Mem_Block->n_Mem_Block_Size))) {
+        p_Pre_Iter_Mem_Block = p_Iter_Mem_Block;
+        p_Iter_Mem_Block = p_Iter_Mem_Block->p_Next_Mem_Block;
+    }
+
+    if (NULL == p_Iter_Mem_Block) {
+        return;
+    }
+
+    p_Iter_Mem_Block->n_Free_Mem_Page_Num++;
+    *((uint32_t*)ptr) = p_Iter_Mem_Block->n_First_Free_Mem_Page_ID;
+    p_Iter_Mem_Block->n_First_Free_Mem_Page_ID = (uint32_t)((char*)ptr - (char*)(p_Iter_Mem_Block->data_Region)) / n_Mem_Page_Size;
+
+    if (p_Iter_Mem_Block->n_Free_Mem_Page_Num * n_Mem_Page_Size == p_Iter_Mem_Block->n_Mem_Block_Size) {
+        if (p_Pre_Iter_Mem_Block) {
+            p_Pre_Iter_Mem_Block->p_Next_Mem_Block = p_Iter_Mem_Block->p_Next_Mem_Block;
+        }else {
+            p_Mem_Block = p_Iter_Mem_Block->p_Next_Mem_Block;
+        }
+        delete (p_Iter_Mem_Block);
+    } else {
+        if (p_Pre_Iter_Mem_Block) {
+            p_Iter_Mem_Block->p_Next_Mem_Block = p_Mem_Block;
+            p_Mem_Block = p_Iter_Mem_Block;
+        }
+    }
+}
diff --git a/mem_pool.cpp b/mem_pool.cpp
index 6b382e7..c1a0061 100644
--- a/mem_pool.cpp
+++ b/mem_pool.cpp
@@ -80,3 +80,15 @@ void Mem_Pool::free_Mem(void *ptr) {
         }
     }
 }
+
+Mem_Block::Mem_Block(uint32_t _n_Mem_Page_Num, uint32_t _n_Mem_Page_Size)
+    : n_Mem_Block_Size(_n_Mem_Page_Num * _n_Mem_Page_Size),
+      n_Free_Mem_Page_Num(_n_Mem_Page_Num - 1),
+      n_First_Free_Mem_Page_ID(1),
+      p_Next_Mem_Block(NULL) {
+    char *p_Data = data_Region;
+    for (uint32_t i = 1; i < _n_Mem_Page_Num; ++i) {
+        *reinterpret_cast<uint32_t*>(p_Data) = i;
+        p_Data += _n_Mem_Page_Size;
+    }
+}
diff --git a/mem_pool.cpp b/mem_pool.cpp
index c1a0061..43ed0ee 100644
--- a/mem_pool.cpp
+++ b/mem_pool.cpp
@@ -92,3 +92,12 @@ Mem_Block::Mem_Block(uint32_t _n_Mem_Page_Num, uint32_t _n_Mem_Page_Size)
         p_Data += _n_Mem_Page_Size;
     }
 }
+
+Mem_Pool::~Mem_Pool() {
+    Mem_Block *p_Iter_Mem_Block = p_Mem_Block;
+    while (p_Iter_Mem_Block) {
+        Mem_Block *p_Delete_Mem_Block = p_Iter_Mem_Block;
+        p_Iter_Mem_Block = p_Iter_Mem_Block->p_Next_Mem_Block;
+        delete (p_Delete_Mem_Block);
+    }
+}