/* 用途:用于分配内存空间的模板,作为第一级分配; 模板形参:无意义,模板内没有使用 接口函数: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)(); };
时间: 2024-11-03 21:47:41