线程不安全
my_mem_pool.h
1 /*
2 realize my own memory pool
3 */
4 #include <iostream>
5 #include <list>
6 #include <cstdio>
7 #include <cstdlib>
8 #include <set>
9 class MemPool {
10 public:
11 // every time we call get, we can get the BlockSize bytes of memory
12 MemPool(int BlockSize, int PoolSize) : m_block_size(BlockSize), m_pool_size(PoolSize)
13 ,m_free_num(0) {
14 std::cout << __func__ << std::endl;
15 m_free_list.clear();
16 m_alloc_set.clear();
17 }
18
19 ~MemPool() {
20 std::cout << __func__ << ",set_size = " << m_alloc_set.size() << std::endl;
21 for (std::set<void*>::iterator it = m_alloc_set.begin(); it != m_alloc_set.end(); ++it) {
22 free(*it);
23 }
24 for (std::list<void*>::iterator it = m_free_list.begin();
25 it != m_free_list.end(); ++it) {
26 free(*it);
27 }
28 m_free_num = 0;
29 }
30
31 inline void* get() __attribute__((always_inline)) {
32 void* mem = NULL;
33 if (m_free_num > 0) {
34 --m_free_num;
35 mem = m_free_list.front();
36 m_free_list.pop_front();
37 } else {
38 mem = malloc(m_block_size);
39 }
40 m_alloc_set.insert(mem);
41 return mem;
42 }
43
44 inline void release(void* p) __attribute__((always_inline)) {
45 if (m_free_num < m_pool_size) {
46 m_free_list.push_back(p);
47 ++m_free_num;
48 } else {
49 // destroy
50 free (p);
51 }
52 m_alloc_set.erase(p);
53 }
54
55 int get_free_num() {
56 return m_free_num;
57 }
58 private:
59 int m_block_size;
60 int m_pool_size;
61 int m_free_num; // the num of memory block in the pool which can be useed
62 std::list<void*> m_free_list;
63 std::set<void*> m_alloc_set;
64 };
my_mem_pool.cpp
1 #include "my_mem_pool.h"
2 #include <iostream>
3 #include <boost/shared_ptr.hpp>
4 int main() {
5 MemPool* pool = new MemPool(1024, 3);
6 void* p1 = pool->get();
7 void* p0 = pool->get();
8 void* p2 = pool->get();
9 std::cout << "p0 = " << p0 << std::endl;
10 std::cout << "p1 = " << p1 << std::endl;
11 std::cout << "p2 = " << p2 << std::endl;
12 std::cout << "size = " << pool->get_free_num() << std::endl;
13 pool->release(p0);
14 pool->release(p1);
15 pool->release(p2);
16 std::cout << "size = " << pool->get_free_num() << std::endl;
17 void* p3 = pool->get();
18 std::cout << "size = " << pool->get_free_num() << std::endl;
19 void* p4 = pool->get();
20 void* p5 = pool->get();
21 void* p6 = pool->get();
22 std::cout << "size = " << pool->get_free_num() << std::endl;
23 pool->release(p3);
24 pool->release(p4);
25 pool->release(p5);
26 delete pool;
27 std::cout << "size = " << pool->get_free_num() << std::endl;
28 }