STL 一级配置器

一,一级配置器的源代码

/**
*  注意:没有类型参数,非类别参数inst完全没有用到
*/
template<int inst>
class _malloc_alloc_template{
private:
    //下面的函数用来处理内存不足的情况
    //oom:out of memory
    static void *oom_malloc(size_t);
    static void *oom_realloc(void *, size_t);
    static void (*_malloc_alloc_oom_handler)();
public:
    static void (* set_malloc_handler(void(*f)))();
    static void *allocate(size_t){
    static void deallocate(void *, size_t);
    static void *reallocate(void *, size_t);
};

/**
*  初始值为0,由用户指定内存不足时的处理函数
*/
template<int inst>
void (*_malloc_alloc_template<int inst>::_malloc_alloc_oom_handler)() = 0;

/**
*  使用一级配置器获取内存
*/
template<int inst>
void *_malloc_alloc_template<int inst>::allocate(size_t n){
    //一级配置器直接使用malloc()来获取内存
    void *result = malloc(n);
    //内存请求得不到满足时,调用oom_malloc()
    if(0 == result){
        result = oom_malloc(n);
    }
    return result;
}

/**
*  使用一级配置器释放内存
*/
template<int inst>
void _malloc_alloc_template<int inst>::deallocate(void *p, size_t n){
    //一级配置器直接使用free(),来释放内存
    free(p);
}

/**
*  使用一级配置器对申请的内存,进行大小调整
*/
template<int inst>
void *_malloc_alloc_template<int inst>::reallocate(void *p, size_t new_sz){
    //一级配置器直接使用realloc()
    void *result = realloc(p, new_sz);
    //当要求无法满足时,调用oom_realloc()
    if(0 == result){
        result = oom_realloc(p, new_sz);
    }
    return result;
}

/**
*  第一次分配内存不成功,会调用这个函数,它会不断的调用"内存不足处理程序",期望在
*  某次调用之后,获得足够的内存
*/
template<int inst>
void *_malloc_alloc_template<int inst>::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;
        }
    }
}

二,一级配置器的工作原理

一级配置器使用malloc()、free()、realloc()等C函数执行实际的内存配置、释放、重配置操作。SGI第一级配置器allocate()和realloc()都是在调用malloc()和realloc()不成功后,改调用oom_malloc()和oom_realloc()。后两者都有内循环,不断调用"内存不足处理函数",期望在某次调用之后,获得足够的内存。但如果"内存不足处理函数"没有被用户设置,就会调用_THROW_BAD_ALLOC,丢出bad_alloc异常或利用exit(1)终止程序。


三,一级配置器实现类似C++ new-handler机制

1,C++ new-handler机制

在申请内存的需求得不到满足时,调用一个客户端指定的函数。换句话说,一旦new无法完成任务,在丢出bad_alloc异常之前,会先调用客户端指定的函数,该指定的函数称为new-handler。


2,SGI使用malloc来配置内存,因此,SGI不能直接使用C++的set_new_handler(),必须仿真一个类似的set_malloc_handler()函数,来实现类似new-handler机制。

static void (*set_malloc_handler(void(*f)))();{
    void (*old)() = _malloc_alloc_oom_handler;
    _malloc_alloc_oom_handler = f;
    return (old);
}































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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值