STL源码学习之一级空间配置器

一级空间配置器


源码:

 #if 0
 #    include <new>
 #    define __THROW_BAD_ALLOC throw bad_alloc
 #elif !defined(__THROW_BAD_ALLOC)
 #    include <iostream>
 #    define __THROW_BAD_ALLOC cerr << "out of memery" << endl; exit(1);
 #endif
  
 // malloc-based allocator.通常比稍后介绍的 default alloc 速度慢
 // 一般而言是thread-safe,并且对于空间的运用比较高效
 // 以下是第一级配置器
 // 注意,无“template型别参数”。置于“非型别参数”inst,则完全没排上用场
 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_handler)();
 public:
     static void * allocate(size_t n) {
         void *result = malloc(n); // 第一级配置器直接使用malloc
         // 无法满足需求时,改用oom_malloc
         if (0 == result) result = oom_malloc(n);
         return result;
     }
 
     static void deallocate(void *p, size_t /* n */) {
         free(p); // 第一级配置器直接用free()
     }
 
     static void * reallocate(void *p, size_t /* old_sz */, size_t new_sz) {
         void *result = realloc(p, new_sz);
         if (0 == result) result = oom_realloc(p, new_sz);
         return result;
     }
 
     // 以下仿真C++的 set_handler()。换句话,你可以通过它
     // 指定自己的 out-of-memory handler,企图释放内存
     // 因为没有调用 new,所以不能用 set_new_handler
     static void (* set_malloc_handler(void (*f)())) () {
         void (*old)() = __malloc_alloc_oom_handler;
         __malloc_alloc_oom_handler = f;
         return old;
     }
 };
 
 // 初值为0,待定
 template <int inst>
 void (* __malloc_alloc_template<inst>::__malloc_alloc_oom_handler)() = 0;
 
 template <int inst>
 void * __malloc_alloc_template<inst>::oom_malloc(size_t n) {
     void (* my_malloc_handler)();
     void *result;
 
     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;
     }
 }
 
 template <int inst>
 void * __malloc_alloc_template<inst>::oom_realloc(void *p, size_t n) {
     void (* my_malloc_handler)();
     void *result;
 
     for (;;) {
         my_malloc_handler = __malloc_alloc_oom_handler;
         if (0 == my_malloc_handler) {__THROW_BAD_ALLOC;}
         (*my_malloc_handler)();
         result = realloc(p, n);
         if (result) return result;
 }


其中oom_malloc,当malloc失败时,这个函数就被调用。它的作用就是去调用用户自定义的释放空间的一个函数__malloc_alloc_oom_handler,不断的去释放空间,直到可以申请空间为止,如果实在不成功就会抛出异常,结束程序

oom_realloc和oom_malloc大同小异,几乎是一样的。惟一的区别在于前者是realloc申请空间,后者是malloc申请空间

typedef void (*FUNC)() ,FUNC是一种类型,它定义的变量是指向函数的指针

就相当于static FUNC set_malloc_handler(FUNC f)  说白了,就是一个函数它的参数是个指针,它的返回值也是个指针,就这样!!!

如果细一点说,那么参数和反回值都是指向函数的指针。





全部评论

相关推荐

Yki_:你要算时间成本呀,研究生两三年,博士三四年,加起来就五六年了,如果你本科去腾讯干五年,多领五年的年薪,加上公司内涨薪,可能到时候十五年总薪资也跟博士差不多
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务