首页 > 代码库 > SGI空间分配器之第一级配置器剖析

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)();};

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