• 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)();
    };
  • 相关阅读:
    vue_03
    vue03
    vue2
    vue02
    vue 01
    JavaScript要点 (一) 变量-作用域
    在iOS应用程序中打开设备设置界面及其中某指定的选项界面
    多线程操作Coredata(转)
    iOS_城市定位
    本地验证码
  • 原文地址:https://www.cnblogs.com/miner007/p/4149443.html
Copyright © 2020-2023  润新知