STL一级空间配置器(SGI版本)

SGI中空间一级配置器的。主要是借助malloc,free,realloc函数实现。以下的代码是摘自stl_alloc.h头文件。

template <int __inst>

class __malloc_alloc_template {

 

private:

 

  static void*_S_oom_malloc(size_t);  //out of memory时malloc

  static void*_S_oom_realloc(void*, size_t);  //out of memory 时realloc

 

#ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG

  static void (*__malloc_alloc_oom_handler)();  //out of memory时处理函数。

  //这个函数我们可以自己设置,通过调用__set_malloc_handler

#endif

 

public:

 

  static void*allocate(size_t __n)  //malloc一块空间

  {

    void*__result = malloc(__n);  //__result指向这块空间

    if (0 ==__result) __result = _S_oom_malloc(__n);  //如果内存不够时。

    return__result;

  }

 

  static voiddeallocate(void* __p, size_t /* __n */)  //释放空间

  {

    free(__p);

  }

 

  static void*reallocate(void* __p, size_t /* old_sz */, size_t __new_sz) //realloc

//一块空间,同样也是在realloc失败时调用_S_oom_realloc。

  {

    void*__result = realloc(__p, __new_sz);

    if (0 ==__result) __result = _S_oom_realloc(__p, __new_sz);

    return__result;

  }

 //设置类似与c++ new handler的内存不足的处理程序

  static void (*__set_malloc_handler(void (*__f)()))()

  {

    void (*__old)() = __malloc_alloc_oom_handler;

   __malloc_alloc_oom_handler = __f;

   return(__old);

  }

 

};

 

// malloc_alloc out-of-memory handling

 

#ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG

template <int __inst>

void (* __malloc_alloc_template<__inst>::__malloc_alloc_oom_handler)()= 0;

#endif

 

//内存不足时的空间分配

template <int __inst>

void*

__malloc_alloc_template<__inst>::_S_oom_malloc(size_t__n)

{

    void (*__my_malloc_handler)();

    void*__result;

 

    for (;;) {

       __my_malloc_handler = __malloc_alloc_oom_handler;//默认的内存不

//足的处理程序没有。如果我们不自己去写一个处理的函数,那么在内存不足的

//时候就会直接抛出异常。

        if (0 ==__my_malloc_handler) { __THROW_BAD_ALLOC; }

       (*__my_malloc_handler)(); //如果我们有自己设定了一个处理的函数,

//在内存不足的时候,首先要调用这个处理的函数,处理完毕后,再次去申请空

//间,申请得到就返回指向这块空间的地址,如果失败的话,就要继续去处理,

//申请,····

        __result= malloc(__n);

        if(__result) return(__result);

    }

}

//这是reallco内存不足时的内存申请。

template <int __inst>

void*__malloc_alloc_template<__inst>::_S_oom_realloc(void* __p, size_t __n)

{

    void (*__my_malloc_handler)();

    void*__result;

 

    for (;;) {

       __my_malloc_handler = __malloc_alloc_oom_handler;

        if (0 ==__my_malloc_handler) { __THROW_BAD_ALLOC; }

       (*__my_malloc_handler)();

        __result= realloc(__p, __n);

        if(__result) return(__result);

    }

}

 

typedef __malloc_alloc_template<0> malloc_alloc;

//这个只是一个标准的接口,对于SGI的stl,由于他是具有次层配置。除了一级

//配置以外,还有二级配置,而且二级配置更加复杂。但是我们调用的时候不会

//去关系是应该调用一级还是二级,只是调用这个接口。然后让这个接口去负责//调用一级还是二级配置

template<class _Tp, class _Alloc>

class simple_alloc {

 

public:

    static _Tp*allocate(size_t __n)

      { return 0== __n ? 0 : (_Tp*) _Alloc::allocate(__n * sizeof (_Tp)); }

    static _Tp*allocate(void)

      { return(_Tp*) _Alloc::allocate(sizeof (_Tp)); }

    static voiddeallocate(_Tp* __p, size_t __n)

      { if (0 !=__n) _Alloc::deallocate(__p, __n * sizeof (_Tp)); }

    static voiddeallocate(_Tp* __p)

      {_Alloc::deallocate(__p, sizeof (_Tp)); }

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值