- 头文件
- #include ”boost/pool.hpp“
- 笔记
- 对于频繁分配及释放大量固定大小的小内存的操作可以用pool来实现,pool接口保证没有内存泄露。
- pool有两个分配器:
- pool_allocator : 用于任意数量的连续块。
- fast_pool_allocator: 用于一次只分配一块的场景。也可以用于一次分配任意数量的连续块,但是效率没有pool_allocator好。
- pool不需要编译,只要引用头文件就可以使用。
- 对于内存池的使用分为两种方式:
- 按照一般对象的方式使用pool,在销毁pool对象的时候同时也会销毁由它分配的内存。
- 按照单例方式,单例方式中,pool对象是共享的,单例的pool也是线程安全的。由单例方式的pool分配的内存需要通过release_memory()或者purge_memory()来释放。否则内存就会等到程序退出导致单例pool被销毁后才会被释放。
- 接口出错会返回0,尽量不抛出异常。
- 使用pool时需要引用命名空间 boost::details::pool
1. template<typename UserAllocator = ... >
2. class pool
3. {
4. public:
5.
6. explicit pool(size_type requested_size);
7. ~pool();
8.
9. size_type get_requested_size()const;
10.
11.
12. void * malloc();
13. void * ordered_malloc();
14. void * ordered_malloc(size_type n);
15. bool is_from(void * chunk)const;
16.
17.
18.
19. void free(void *chunk);
20. void ordered_free(void * chunk);
21. void free(void *chunk,size_type n);
22. void ordered_free(void *chunk,size_type n);
23.
24.
25. bool release_memory();
26.
27. bool purge_memory();
28. };
1 explicit pool(const size_type nrequested_size,
2 const size_type nnext_size = 32,
3 const size_type nmax_size = 0)
- 第一个参数是每次申请的chunk的大小,第二个参数首次申请内存时一次分配的chunk的个数,下次pool在内存不足时会自动申请内存,申请数量翻倍,第三个参数一个block中最多的chunk数目,第二个参数不能大于它,如果为0,就没有限制了。
- pool中的free函数一般不需要程序员调用,在pool析构的时候会自动释放其所管理的内存。