代码如下:#include "stdafx.h" #include
const int MAXLENGTH = 500000;class A { public:A()
{ m_i++;} ~A( )
{ m_i——;} private:int m_i;};
int main ( )
{ object_pool q;
clock_t clock_begin = clock();for (int i = 0; i < MAXLENGTH; ++i)
{ A* a = q.construct();q.destroy(a);}
clock_t clock_end = clock();cout<<"程序运行了 "<
{ A* a = new A;delete a;} clock_end = clock();cout<<"程序运行了 "<
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 "stdafx.h" #include
int _tmain(int argc, _TCHAR* argv[])
{ clock_t clock_begin = clock();int iLength = 0;for (int i = 0; ;++i)
{ void* p = malloc(1024*1024);&