STL的第一级空间配置器

2013年4月25日 由 Creater 留言 »

STL的第一级空间配置器,该配置用于超过128K内存申请请求时。其中的allocate直接使用malloc来进行内存分配,如果分配失败则交由oom_malloc (out of memory),如果oom_malloc分配失败则根据函数set_malloc_handler设置的处理方式释放内存并重新申请,如果没有设置set_malloc_handler则在遇到无内存可分配时的处理方式为抛出异常。同理对于realloc也是一样道理。

template <int inst>
class __malloc_alloc_template {

private:
//allocate里调用malloc失败时调用该函数
static void *oom_malloc(size_t);
//reallocate里调用relloc失败时调用该函数
static void *oom_realloc(void *, size_t);
//上边两个函数失败时处理函数
#ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG
    static void (* __malloc_alloc_oom_handler)();
#endif
public:
//直接调用malloc分配内存,失败则调用oom_malloc
static void * allocate(size_t n)
{
    void *result = malloc(n);
    if (0 == result) result = oom_malloc(n);
    return result;
}

static void deallocate(void *p, size_t /* n */)
{
    free(p);
}

static void * reallocate(void *p, size_t /* old_sz */, size_t new_sz)
{
    void * result = realloc(p, new_sz);
    if (0 == result) result = oom_realloc(p, new_sz);
    return result;
}

//设置处理函数,返回旧的处理函数
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>::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);
    }
}

template <int inst>
void * __malloc_alloc_template<inst>::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);
    }
}
广告位

发表评论

你必须 登陆 方可发表评论.