第一级配置器 __malloc_alloc_template #if 0 # include <new> # define _THROW_BAD_ALLOC throw bad_alloc #elif !defined(_THROW_BAD_ALLOC) # include <iostream.h> # define _THROW_BAD_ALLOC cerr<<"out of memory"<<endl;exit(1) #endif template<int,inst> class _malloc_alloc_template { private: static void *oom_malloc(size_t); static void *oom_realloc(void*,size_t); static void (*__malloc_alloc_oom_bandler)();//函数指针,用来处理内存不足的情况 public: static void* allocate(size_t) { void* result = malloc(n); if(0 == result) result == oom_malloc(n); return result; }; static void deallocate(void* p, size_t) { free(p); }; static void* reallocate(void* p , size_t , size_t new_sz) { void* result = realloc(p,new_sz); if(0 == result) result = oom_realloc(p,new_sz); return result; }; //仿真set_new_handler static void (*set_malloc_handler(void(*f)()))() { void(*old)() = __malloc_alloc_oom_bandler; __malloc_alloc_oom_bandler = f; return (old); }; }; template<inst> void (*_malloc_alloc_template<inst>::__malloc_alloc_oom_bandler)() = 0; template<int,inst> void *_malloc_alloc_template<ints>::oom_malloc(size_t n) { void(*my_alloc_handler)(); void*result; while(1) { my_alloc_handler = __malloc_alloc_oom_bandler; if(0 == my_alloc_handler){ _THROW_BAD_ALLOC;} (my_alloc_handler)();//调用处理函数,释放内存 result = malloc(n); if (result) return result; } }; template<int,inst> void *_malloc_alloc_template<ints>::oom_realloc(void * p, size_t n) { void(*my_alloc_handler)(); void*result; while(1) { my_alloc_handler = __malloc_alloc_oom_bandler; if(0 == my_alloc_handler){ _THROW_BAD_ALLOC;} (my_alloc_handler)();//调用处理函数,释放内存 result = realloc(p,n); if (result) return result; } };