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