SGI空间分配器之第一级配置器剖析

/*
用途:用于分配内存空间的模板,作为第一级分配;
模板形参:无意义,模板内没有使用
接口函数:allocate函数用于分配空间
          reallocate函数用于指定地址重新分配空间
          deallocate函数用于释放空间
          set_malloc_hander函数用于获取“内存不足处理例程”的函数
时间:2014-12-4
*/
template <int inst>
class __malloc_alloc_template
{
private:
    typedef void (*Func)();//定义一个函数指针类型为Func表示void (*)()
public:
    static void* allocate(size_t n)
    {
        void *result=malloc(n);
        if(0==result)
        {//stl_alloc.h中的oom_malloc(n);处理过程
            Func my_malloc_handler;//定义一个临时的函数指针变量。
            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);//如果成功分配,则结束;否则就继续历程处理,继续内存分配
            }
        }
        return result;
    }
    static void deallocate(void *p,size_t n)//实质上只是用了P
    {
        free(p);
    }
    static void* reallocate(void *p,size_t oldSZ,size_t newSZ)//老的内存大小无用了
    {
        
        void *result=remalloc(p,newSZ);//本身功能就是将旧的内容拷贝到新的内容中,且自己寻找内存块
        //类似处理
        /*异常处理块

        */
        return result;
    }
    //static void (* set_malloc_hander(void (*f)))()
    static Func set_malloc_hander(Func f)//用于获取历程处理的函数;且返回之前的历程处理函数
    {
        Func old=__malloc_alloc_oom_handler;
        __malloc_alloc_oom_handler=f;
        return old;
    }
private:
    //定义一个函数指针变量,用于指定处理内存不足处理历程,也可以为static Func __malloc_alloc_oom_handler;
    static void (* __malloc_alloc_oom_handler)();
};
posted @ 2014-12-07 15:14  miner007  阅读(235)  评论(0编辑  收藏  举报