4. Boost内存池的分类
Boost内存池按照不同的理念分为四类。主要是两种理念的不同造成了这样的分类。
一是Object Usage和Singleton Usage的不同。Object Usage意味着每个内存池都是一个可以创建和销毁的对象,一旦内存池被销毁则其所分配的所有内存都会被释放。Singleton Usage意味着每个内存池都是一个被静态分配的对象,直至程序结束才会被销毁,这也意味着这样的内存池是多线程安全的。只有使用release_memory或者 purge_memory方法才能释放内存。
二是内存溢出的处理方式。第一种方式是返回NULL代表内存池溢出了;第二种方式是抛出异常代表内存池溢出。
根据以上的理念,boost的内存池分为四种。
4.1 Pool
Pool是一个Object Usage的内存池,溢出时返回NULL。
4.2 object_pool
object_pool与pool类似,唯一的区别是当其分配的内存释放时,它会尝试调用该对象的析购函数。
4.3 singleton_pool
singleton_pool是一个Singleton Usage的内存池,溢出时返回NULL。
4.4 pool_alloc
pool_alloc是一个Singleton Usage的内存池,溢出时抛出异常。
5. 内存池溢出的原理与解决方法
5.1 必然溢出的内存
内存池简化了很多内存方面的操作,也避免了一些错误使用内存对程序造成的损害。但是,使用内存池时最需要注意的一点是要处理内存池溢出的情况。
没有不溢出的内存,看看下面的代码:
#include <iostream>
#include <ctime>
#include <vector>
#include <boost/pool/pool.hpp>
#include <boost/pool/object_pool.hpp>
using namespace std;
using namespace boost;
int _tmain(int argc, _TCHAR* argv[])
{
clock_t clock_begin = clock();
int iLength = 0;
for (int i = 0; ;++i)
{
void* p = malloc(1024*1024);
if (p == NULL)
{
break;
}
++iLength;
}
clock_t clock_end = clock();
cout<<"共申请了"<<iLength<<"M内存,程序运行了"<<clock_end-clock_begin<<" 个系统时钟"<<endl;
return 0;
}
运行的结果是“共申请了1916M内存,程序运行了 69421 个系统时钟”,意思是在分配了1916M内存后,malloc已经不能够申请到1M大小的内存块了。