noobSTL-1-配置器-2

第一级配置器

1. 功能分析

第一级配置器以malloc(),free(),realloc()等C语言函数来执行实际的内存配置。

使用C语言函数是因为C++并未直接提供类似realloc()的内存配置操作(但是可以使用new等操作模拟)。

因为使用C语言的函数,故无法直接使用C++的set_new_handler(),于是利用宏和函数指针仿真了一个类似的set_new_handler()。

2. 结构分析

整个第一级配置器是一个模板类。

该类包含了内存分配、调整、释放三个函数,以及相应的两个内存不足处理函数,一个仿真的set_new_handler()。

3. 源码分析

宏定义

#if !defined(__THROW_BAD_ALLOC)
# include <iostream>
# define __THROW_BAD_ALLOC std::err<<"out of memory"<<std::endl;exit(1);
#endif

此处定义了一个用于简单处理内存不足的宏

简单地抛出一个异常。

set_new_handler()

static void (* set_malloc_handler (void(*f) ())) ()
{
void (* old)() = __malloc_alloc_oom_handler;
__malloc_alloc_oom_handler = f;
return old;
}

这里是最令人困惑的点。

这是一个函数set_malloc_handler,它接受一个void ()()类型的参数f,返回类型为void ()()。

就是上文提到的仿真的set_new_handler()。

template <int inst>
void (* __malloc_alloc_template<inst>::__malloc_alloc_oom_handler)() = 0;

这里设置了初始状态,如果没有主动设置,该oom处理函数指针指向NULL。

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;
}
}

默认的oom处理就是调用一开始我们定义的宏。

当然,我们定义的那个宏也是可以设置的。

最新文章

  1. java基础算法之插入排序
  2. VirtualBox安装Debian6的方法和步骤(详细)
  3. TFS命令tf:undo(强制签入签出文件)
  4. 【PowerOJ1740】 圆桌问题
  5. 9.4---集合子集(CC150)
  6. 基于jquery的页面预载入效果(loading)
  7. LeetCode-391. 完美矩形(使用C语言编译,详解)
  8. unity做游戏常用功能实现(一)多方向同时输入也能让物体正常移动
  9. MySQL字段的说明和备注信息
  10. 软件测试面试必问--bug交互流程
  11. 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree
  12. Java学习第一篇 — 字符串
  13. Redis:高性能文件缓存key-value储存
  14. Android: JAVA和C# 3DES加密解密
  15. 【C#】datetimepicker里面如何设置日期为当天日期,而时间设为0:00或23:59?
  16. Appium Python 二:理论概念理解
  17. 转载:IE下div使用margin:0px auto不居中的原因
  18. [转]JVM运行时内存结构
  19. node-schedule 实现定时任务使用方法记录
  20. redis有序集合类型sort set

热门文章

  1. JVM的小理解
  2. Windows里面的虚拟机,部署的项目在同一网段也可以访问到
  3. 流量难、获客难、增长难?增长黑客思维“解救”B端业务
  4. vuejs在解析时出现闪烁的原因及防止闪烁的方法
  5. 4.Docker 操作容器
  6. JS全选按钮练习
  7. 常用UrlEncode编码结果
  8. Mysql备份参数
  9. vue中什么是模块 什么是组件?
  10. View --&gt;Controller传值的几种方法