lwch
【QQ:510134884】【Email:
lwch748@gmail.com
】
C++博客
首頁(yè)
新隨筆
聯(lián)系
聚合
管理
隨筆-91 評(píng)論-137 文章-0 trackbacks-0
山寨STL實(shí)現(xiàn)之a(chǎn)llocator
作為一個(gè)山寨的STL,那么不得不提的是其中的allocator(空間配置器)。顧名思義,它是負(fù)責(zé)空間分配用的,下面代碼十分簡(jiǎn)單,僅對(duì)C函數(shù)malloc和free進(jìn)行了薄薄的一層封裝,同時(shí)給定了自定義函數(shù)free_handler用于在空間分配時(shí)候由于內(nèi)存被占滿了而導(dǎo)致的分配失敗。
這里值得注意的是:這個(gè)釋放函數(shù)的函數(shù)指針應(yīng)該是由調(diào)用方來(lái)負(fù)責(zé)指定,并且它僅有一個(gè)參數(shù)表明至少需要釋放多少字節(jié)的內(nèi)存。
下面來(lái)看代碼,代碼非常簡(jiǎn)單,應(yīng)此這里就不逐一展開(kāi)說(shuō)明了。
#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
完整代碼請(qǐng)到
http://qlanguage.codeplex.com/
下載
posted on 2012-05-20 21:45
lwch
閱讀(1925)
評(píng)論(0)
編輯
收藏
引用
所屬分類:
STL
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
【推薦】100%開(kāi)源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
相關(guān)文章:
QCore/Library說(shuō)明文檔
山寨STL實(shí)現(xiàn)之內(nèi)存池V2
如何比較兩個(gè)變量的類型是否相同
山寨STL實(shí)現(xiàn)之list
山寨STL實(shí)現(xiàn)之內(nèi)存池
山寨STL實(shí)現(xiàn)之vector
山寨STL實(shí)現(xiàn)之traits,construct&destruct
山寨STL實(shí)現(xiàn)之a(chǎn)llocator
山寨STL實(shí)現(xiàn)筆記
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問(wèn)
Chat2DB
管理
編譯原理交流群: 83905136
QLanguage交流群: 38843264
我的騰訊微博
我的新浪微博
QLanguage的新浪微博
QLanguage項(xiàng)目(GoogleCode)
QLanguage項(xiàng)目(GitHub)
博客已轉(zhuǎn)移到:
http://blog.q-devel.com
<
2012年5月
>
日
一
二
三
四
五
六
29
30
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
31
1
2
3
4
5
6
7
8
9
常用鏈接
我的隨筆
我的評(píng)論
我參與的隨筆
留言簿
(2)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類
(92)
CMinus(2)
NScript(26)
QLanguage(24)
STL(9)
操作系統(tǒng)(6)
其他(4)
設(shè)計(jì)模式(15)
數(shù)據(jù)結(jié)構(gòu)(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)
相冊(cè)
QLanguage
Blogs
某牛人的Blog
Projects
NScript Compiler
QLanguage Compiler
Redis
Redis中文命令手冊(cè)
Websites
C++奮斗園
VC知識(shí)庫(kù)
程序員聯(lián)合開(kāi)發(fā)網(wǎng)
最新隨筆
1.?QParserGenerator的文法文件介紹
2.?5年編程之旅
3.?QParserGenerator代碼分析二(A fix&An example)
4.?QParserGenerator代碼分析一(生成LALR1 DFA)
5.?QCore/Library說(shuō)明文檔
6.?詞法分析器2(ε-NFA到DFA的轉(zhuǎn)換)
7.?詞法分析器1(正則表達(dá)式到ε-NFA的轉(zhuǎn)換)
8.?山寨STL實(shí)現(xiàn)之內(nèi)存池V2
9.?如何比較兩個(gè)變量的類型是否相同
10.?山寨STL實(shí)現(xiàn)之list
11.?山寨STL實(shí)現(xiàn)之內(nèi)存池
12.?山寨STL實(shí)現(xiàn)之vector
13.?山寨STL實(shí)現(xiàn)之traits,construct&destruct
14.?山寨STL實(shí)現(xiàn)之a(chǎn)llocator
15.?山寨STL實(shí)現(xiàn)筆記
搜索
積分與排名
積分 - 162857
排名 - 162
最新評(píng)論
1.?re: 5年編程之旅
感謝LWCH的娃娃,當(dāng)年陪伴一起度過(guò)了多少游戲時(shí)間.
--萬(wàn)馬奔騰
2.?re: 5年編程之旅
@zapline
當(dāng)時(shí)確實(shí)用的是別人的代碼,幾年前的東西記不清了,不要這么較真。
--lwch
3.?re: 5年編程之旅
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--zapline
4.?re: 5年編程之旅[未登錄](méi)
這精神我很敬仰, 我是散修, 目前還是入門, 我已經(jīng)入了差不多4年門.
為自己汗顏.
--jains
5.?re: 5年編程之旅
還很年輕,加油
--Richard Wei
閱讀排行榜
1.?LR(0),SLR(1),LR(1)分析器源碼(4761)
2.?觀察者模式(4340)
3.?自制虛擬機(jī)框架(3844)
4.?實(shí)習(xí)一周總結(jié)(3634)
5.?山寨STL實(shí)現(xiàn)之vector(3541)
評(píng)論排行榜
1.?使用面向組合子算法寫詞法分析器(9)
2.?自制虛擬機(jī)框架(9)
3.?CosmosKernel初探(8)
4.?觀察者模式(8)
5.?代理模式(7)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 lwch
久久精品国产一区二区三区日韩
|
亚洲国产精品一区二区三区久久
|
99国产精品久久
|
亚洲性久久久影院
|
a高清免费毛片久久
|
怡红院日本一道日本久久
|
久久人人爽人人澡人人高潮AV
|
亚洲色大成网站WWW久久九九
|
国产精品九九久久免费视频
|
精品久久国产一区二区三区香蕉
|
yy6080久久
|
久久久WWW成人免费毛片
|
久久精品无码午夜福利理论片
|
欧洲国产伦久久久久久久
|
久久精品国产99国产精偷
|
久久人做人爽一区二区三区
|
久久免费香蕉视频
|
99精品伊人久久久大香线蕉
|
久久国产精品99精品国产
|
久久久久亚洲AV无码观看
|
久久久久亚洲AV无码专区桃色
|
久久久久久精品免费免费自慰
|
国内精品免费久久影院
|
久久精品国产91久久麻豆自制
|
国产精品免费看久久久
|
亚洲AV无一区二区三区久久
|
狠狠色丁香久久婷婷综合_中
|
久久久久黑人强伦姧人妻
|
国内精品久久久久影院网站
|
国产激情久久久久影院
|
国内精品免费久久影院
|
99久久伊人精品综合观看
|
久久成人国产精品二三区
|
狠狠久久亚洲欧美专区
|
国内精品久久久久久久97牛牛
|
伊人久久大香线蕉av一区
|
无码人妻精品一区二区三区久久久
|
久久精品一本到99热免费
|
精品无码久久久久国产动漫3d
|
久久久久久精品久久久久
|
久久无码人妻一区二区三区午夜
|