lwch
【QQ:510134884】【Email:
lwch748@gmail.com
】
C++博客
首页
新随笔
联系
聚合
管理
随笔-91 评论-137 文章-0 trackbacks-0
山寨STL实现之allocator
作为一个山寨的STL,那么不得不提的是其中的allocator(空间配置器)。顾名思义,它是负责空间分配用的,下面代码十分简单,仅对C函数malloc和free进行了薄薄的一层封装,同时给定了自定义函数free_handler用于在空间分配时候由于内存被占满了而导致的分配失败。
这里值得注意的是:这个释放函数的函数指针应该是由调用方来负责指定,并且它仅有一个参数表明至少需要释放多少字节的内存。
下面来看代码,代码非常简单,应此这里就不逐一展开说明了。
#ifndef _QLANGUAGE_LIBRARY_ALLOC_H_
#define
_QLANGUAGE_LIBRARY_ALLOC_H_
#if
0
#include
<
new
>
#define
__THROW_BAD_ALLOC throw std::bad_alloc
#elif
!defined(__THROW_BAD_ALLOC)
#include
<
iostream
>
#define
__THROW_BAD_ALLOC std::cerr << "out of memory" << std::endl; exit(1)
#endif
namespace
QLanguage
{
namespace
Library
{
template
<
typename T
>
class
allocator
{
public
:
allocator()
{
}
allocator(
const
allocator
<
T
>&
)
{
}
static
T
*
allocate()
{
const
size_t size
=
sizeof
(T);
T
*
result
=
(T
*
)malloc(size);
while
(result
==
nullptr)
{
if
(free_handler) free_handler(size);
else
__THROW_BAD_ALLOC;
result
=
(T
*
)malloc(size);
}
return
result;
}
static
T
*
allocate(
const
size_t
&
n)
{
const
size_t size
=
n
*
sizeof
(T);
if
(size
<=
0
)
throw
"
bad allocate size
"
;
T
*
result
=
(T
*
)malloc(size);
while
(result
==
nullptr)
{
if
(free_handler) free_handler(size);
else
__THROW_BAD_ALLOC;
result
=
(T
*
)malloc(size);
}
return
result;
}
static
void
deallocate(T
*
p)
{
free(p);
}
static
void
deallocate(T
*
p,
const
size_t
&
)
{
free(p);
}
static
T
*
reallocate(T
*
p,
const
size_t
&
n)
{
const
size_t size
=
n
*
sizeof
(T);
if
(size
<=
0
)
throw
"
bad reallocate size
"
;
T
*
result
=
(T
*
)realloc(p, size);
while
(result
==
nullptr)
{
if
(free_handler) free_handler(size);
else
__THROW_BAD_ALLOC;
result
=
(T
*
)realloc(p, size);
}
return
result;
}
public
:
static
void
(
*
free_handler)(
const
size_t
&
);
static
void
set_handler(
void
(
*
h)(
const
size_t
&
))
{
free_handler
=
h;
}
}
;
template
<
typename T
>
typename
void
(
*
allocator
<
T
>
::free_handler)(
const
size_t
&
)
=
nullptr;
}
}
#endif
完整代码请到
http://qlanguage.codeplex.com/
下载
posted on 2012-05-20 21:45
lwch
阅读(1895)
评论(0)
编辑
收藏
引用
所属分类:
STL
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
QCore/Library说明文档
山寨STL实现之内存池V2
如何比较两个变量的类型是否相同
山寨STL实现之list
山寨STL实现之内存池
山寨STL实现之vector
山寨STL实现之traits,construct&destruct
山寨STL实现之allocator
山寨STL实现笔记
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
编译原理交流群: 83905136
QLanguage交流群: 38843264
我的腾讯微博
我的新浪微博
QLanguage的新浪微博
QLanguage项目(GoogleCode)
QLanguage项目(GitHub)
博客已转移到:
http://blog.q-devel.com
<
2024年11月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
(92)
CMinus(2)
NScript(26)
QLanguage(24)
STL(9)
操作系统(6)
其他(4)
设计模式(15)
数据结构(4)
游戏(2)
随笔档案
(91)
2013年10月 (1)
2013年6月 (1)
2013年5月 (2)
2013年4月 (1)
2013年2月 (2)
2013年1月 (1)
2012年8月 (2)
2012年7月 (1)
2012年6月 (2)
2012年5月 (2)
2011年11月 (1)
2011年9月 (1)
2011年8月 (2)
2011年7月 (5)
2011年6月 (5)
2011年5月 (8)
2011年4月 (2)
2011年3月 (1)
2011年2月 (7)
2011年1月 (8)
2010年12月 (3)
2010年11月 (1)
2010年10月 (1)
2010年9月 (7)
2010年8月 (7)
2010年7月 (15)
2010年6月 (2)
相册
QLanguage
Blogs
某牛人的Blog
Projects
NScript Compiler
QLanguage Compiler
Redis
Redis中文命令手册
Websites
C++奋斗园
VC知识库
程序员联合开发网
最新随笔
1. QParserGenerator的文法文件介绍
2. 5年编程之旅
3. QParserGenerator代码分析二(A fix&An example)
4. QParserGenerator代码分析一(生成LALR1 DFA)
5. QCore/Library说明文档
6. 词法分析器2(ε-NFA到DFA的转换)
7. 词法分析器1(正则表达式到ε-NFA的转换)
8. 山寨STL实现之内存池V2
9. 如何比较两个变量的类型是否相同
10. 山寨STL实现之list
11. 山寨STL实现之内存池
12. 山寨STL实现之vector
13. 山寨STL实现之traits,construct&destruct
14. 山寨STL实现之allocator
15. 山寨STL实现笔记
搜索
积分与排名
积分 - 160846
排名 - 162
最新评论
1. re: 5年编程之旅
感谢LWCH的娃娃,当年陪伴一起度过了多少游戏时间.
--万马奔腾
2. re: 5年编程之旅
@zapline
当时确实用的是别人的代码,几年前的东西记不清了,不要这么较真。
--lwch
3. re: 5年编程之旅
评论内容较长,点击标题查看
--zapline
4. re: 5年编程之旅[未登录]
这精神我很敬仰, 我是散修, 目前还是入门, 我已经入了差不多4年门.
为自己汗颜.
--jains
5. re: 5年编程之旅
还很年轻,加油
--Richard Wei
阅读排行榜
1. LR(0),SLR(1),LR(1)分析器源码(4702)
2. 观察者模式(4325)
3. 自制虚拟机框架(3807)
4. 实习一周总结(3613)
5. 山寨STL实现之vector(3519)
评论排行榜
1. 使用面向组合子算法写词法分析器(9)
2. 自制虚拟机框架(9)
3. CosmosKernel初探(8)
4. 观察者模式(8)
5. 代理模式(7)