技术开发 频道

开源C++函数库Boost内存池使用与测试

  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
<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大小的内存块了。

0
相关文章