SGI 第一级置配器 _malloc_alloc_template 剖析

2366阅读 0评论2011-10-17 lthyxy
分类:C/C++

考虑到小型区块可能造成内存破碎问题,SGI设置了双层置配器.
置配器区块大于128Byte时,调用第一级的,
小于时128128Byte,调用第二级的.
  1. #include <new>
  2. #include <iostream>
  3. using namespace std;

  4. template <int inst>
  5. class _malloc_alloc_template
  6. {
  7.   private:
  8.     //这3个函数用来处理内存不足的情况
  9.     static void * oom_malloc(size_t);
  10.     static void * oom_realloc(void *,size_t);
  11.     static void * (*_malloc_alloc_oom_handler)();
  12.     
  13.   public:
  14.     
  15.     static void * allocate(size_t n)
  16.     {
  17.       void * result = malloc(n);
  18.       if ( 0 == result) result = oom_malloc(n);
  19.       return result;
  20.     }
  21.     
  22.     static void deallocate(void *p,size_t)
  23.     {
  24.       free(p);
  25.     }
  26.     
  27.     static void * reallocate(void *p, size_t,size_t new_sz)
  28.     {
  29.       void *result = realloc(p,new_sz);
  30.       if ( 0 == result) result = oom_realloc(p,new_sz);
  31.       return result;
  32.     }
  33.     //这个函数仿真C++的set_new_handler(),换句话说,你可以通过它指定你的 out-of-memory handler
  34.     static void (* set_malloc_handler( void(*f)() ) ) ()
  35.     {
  36.       void (*old)() = _malloc_alloc_oom_handler;
  37.       _malloc_alloc_oom_handler = f;
  38.       return old;
  39.     }
  40. };
  41.  
  42. template <int inst>
  43. void (* _malloc_alloc_template<inst>::_malloc_alloc_oom_handler)() = 0;

  44. template <int inst>
  45. void * _malloc_alloc_template<inst>::oom_malloc(size_t n)
  46. {
  47.   void * result;
  48.   void (*my_malloc_handler());
  49.   for (;;)//不断的释放,配置,再释放,再配置...
  50.   {
  51.     my_malloc_handler = _malloc_alloc_oom_handler;
  52.     if ( 0 == my_malloc_handler)
  53.     {
  54.      // _THROW_BAD_ALLOC;
  55.     }
  56.     (*my_malloc_handler)();
  57.     result = malloc(n);
  58.     if (result) return result;
  59.   }
  60. }

  61. template <int inst>
  62. void * _malloc_alloc_template<inst>::oom_realloc(void *p, size_t n)
  63. {
  64.   void * result;
  65.   void (*my_malloc_handler());
  66.   for (;;)
  67.   {
  68.     my_malloc_handler = _malloc_alloc_oom_handler;
  69.     if ( 0 == my_malloc_handler)
  70.     {
  71.      // _THROW_BAD_ALLOC;
  72.     }
  73.     (*my_malloc_handler)();
  74.     result = realloc(p, n);
  75.     if (result) return result;
  76.   }
  77. }

  78. typedef _malloc_alloc_template<0> malloc_alloc;

上一篇:构造和析构的基本工具:constuct()和destroy()
下一篇:内存池(memory pool)