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