C++:allocator 學(xué)習(xí)整理

簡(jiǎn)介:allocator類(lèi)是C++的一個(gè)模板姨蟋,它提供類(lèi)型化的內(nèi)存分配以及對(duì)象的分配和撤銷(xiāo)范嘱。
詳介:allocator類(lèi)定義在頭文件memory中吉拳。它幫助我們將內(nèi)存分配和對(duì)象構(gòu)造分離開(kāi)來(lái)暮芭。對(duì)于內(nèi)存管理想鹰,我們大都習(xí)慣使用new 和 delete胎围,畢竟這語(yǔ)句簡(jiǎn)單好記吁系。而allocator類(lèi)的用武之地體現(xiàn)在,你想更細(xì)致得去管理你的內(nèi)存白魂,減少浪費(fèi)汽纤。下面舉個(gè)例子。

#include <iostream>
using namespace std;
int main()
{
   //當(dāng)我們想輸入一些單詞到一個(gè)string的數(shù)組
    int n = 1000;//因?yàn)椴淮_定福荸,就給多點(diǎn)
    string *p = new string[n];
    string *q = p;
    string word;
    while (cin >> word) {  //輸入
        *p++ = word;
    }
    while (q != p) {       //輸出
        cout << *q++ << " " << flush;
    }
    cout << endl;
    delete []p;
    q = nullptr;
    return 0;
}

new做的事情就是蕴坪,把這1000個(gè)string先默認(rèn)初始化。對(duì)于沒(méi)有默認(rèn)初始化對(duì)象的還不能用new逞姿,對(duì)需要用到的string對(duì)象辞嗡,后面進(jìn)行賦值相當(dāng)于賦值了兩次。
就比如來(lái)了10個(gè)客人滞造,主人說(shuō)要給他們倒飲料续室,但是不知道誰(shuí)要喝什么。然后你就屁顛屁顛的拿出10個(gè)杯子谒养,擺在他們面前挺狰,每個(gè)杯子底都先倒上牛奶,然后如果誰(shuí)要茶就倒掉牛奶換成茶买窟,要是果汁就倒掉牛奶換成果汁丰泊。
而allocator做的事情就是,我拿出10個(gè)杯子始绍,然后擺他們面前瞳购,什么也不干,要喝什么就給倒什么亏推,不說(shuō)話的就什么也不干学赛。
這里倒飲料的默認(rèn)構(gòu)造函數(shù)就是年堆,倒牛奶。

allocator<T> a; 定義名為a的allocator對(duì)象盏浇,可以分配內(nèi)存或構(gòu)造T類(lèi)型的對(duì)象变丧。
a.allocate(n); 分配原始的構(gòu)造內(nèi)存以保存T類(lèi)型的n個(gè)對(duì)象.
a.deallocate( p, n ) 釋放內(nèi)存,在名為p的T指針中包含的地址處保存T類(lèi)型的n個(gè)對(duì)象绢掰。
a.construct( p, t ) 在T
指針p所指向的內(nèi)存中構(gòu)造一個(gè)新元素痒蓬。運(yùn)行T類(lèi)型的復(fù)制構(gòu)造函數(shù)用t初始化該對(duì)象
a.destroy(p) 運(yùn)行T*指針p所指向的對(duì)象的析構(gòu)函數(shù)

下面又要來(lái)例子了:

#include <iostream>
using namespace std;
int main()
{
    int n = 1000; //老樣子給個(gè)大數(shù)
    allocator<string> alloc; //擁有分配string內(nèi)存能力的alloc
    auto const p = alloc.allocate(n); //分配n個(gè)未初始化的string
    auto q = p;
    //為string賦值
    alloc.construct(q++);           //*q為空
    alloc.construct(q++, 10, 'c');  //*q為cccccccccc
    alloc.construct(q++, "hi");     //*q為 hi
    //cout << *q-- << endl;        //q所指向的內(nèi)存還未構(gòu)造,會(huì)發(fā)生未知的行為
    while (q != p) {
        alloc.destroy(--q);        //要挨個(gè)摧毀元素
    }
    alloc.deallocate(p, n);       //摧毀內(nèi)存空間
    return 0;
}

對(duì)于上面舉的牛奶的例子滴劲,我感覺(jué)還是有一點(diǎn)點(diǎn)牽強(qiáng)攻晒。我再對(duì)比一下new 和 allocator。
new做的事情是哑芹,分配內(nèi)存炎辨,然后去調(diào)用該對(duì)象的默認(rèn)構(gòu)造函數(shù)捕透。
delete 做的事情就是先摧毀對(duì)象內(nèi)容聪姿,再毀掉對(duì)象。
allocator對(duì)應(yīng)的就是分配內(nèi)存乙嘀,construct是初始化對(duì)象
destroy對(duì)應(yīng)的是摧毀對(duì)象內(nèi)容末购,deallocator對(duì)應(yīng)的就是毀掉對(duì)象。


關(guān)于要理解為什么不去默認(rèn)初始化能省內(nèi)存和摧毀要分兩步走虎谢。
我認(rèn)為先要理解這個(gè)盟榴。
當(dāng)我們?nèi)ヂ暶饕粋€(gè)數(shù)組 int arr[5],并初始化以后婴噩,我們可以發(fā)現(xiàn)擎场,arr其實(shí)是一個(gè)地址,他指向元素的首元素几莽。
(這是一個(gè)數(shù)組迅办,里面的xxxx是地址)
[[xxxx]--------------->[0000000000···01] (一串二進(jìn)制用來(lái)表示對(duì)應(yīng)的數(shù)值 )
[xxxx]--------------->[0000000000···11] (一串二進(jìn)制用來(lái)表示對(duì)應(yīng)的數(shù)值 )
[xxxx]--------------->[000000000···011] (一串二進(jìn)制用來(lái)表示對(duì)應(yīng)的數(shù)值 )
[xxxx]--------------->[0000000000···10] (一串二進(jìn)制用來(lái)表示對(duì)應(yīng)的數(shù)值 )
[xxxx]]--------------->[0000000000···01] (一串二進(jìn)制用來(lái)表示對(duì)應(yīng)的數(shù)值 )
當(dāng)我們要去初始化的時(shí)候,我們先弄出一個(gè)存放5個(gè)指針的內(nèi)存空間這個(gè)時(shí)候里面并沒(méi)有值章蚣,我們只是開(kāi)辟一個(gè)[ ]這么大的空間站欺,而里面對(duì)應(yīng)的指針?biāo)赶虻牡刂凡](méi)有構(gòu)建,只是顯示可用纤垂。就比如說(shuō)我家住在某某山上面矾策,然后把地址寫(xiě)在一張紙上(分配內(nèi)存空間),這個(gè)是我的地址峭沦,而地址指向的地方確實(shí)什么都沒(méi)有贾虽,可用。然后你說(shuō)要給我一棟別墅(賦值)吼鱼,這個(gè)時(shí)候我就去這個(gè)地址上面夯哧夯哧得去蓋別墅去蓬豁。
當(dāng)你要?dú)У暨@片空間的時(shí)候履磨,你不能只毀掉這張紙,你不能唯心的說(shuō)紙不在了別墅就不在了庆尘,你得先去把別墅毀了(destroy)剃诅,然后再把我紙燒了(deallocate)。

寫(xiě)在最后驶忌,我在寫(xiě)的時(shí)候難免有些我理解不對(duì)的矛辕,或者哪里寫(xiě)錯(cuò)的,歡迎指正付魔,一起學(xué)習(xí)聊品。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市几苍,隨后出現(xiàn)的幾起案子翻屈,更是在濱河造成了極大的恐慌,老刑警劉巖妻坝,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伸眶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡刽宪,警方通過(guò)查閱死者的電腦和手機(jī)厘贼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)圣拄,“玉大人嘴秸,你說(shuō)我怎么就攤上這事”幼唬” “怎么了岳掐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饭耳。 經(jīng)常有香客問(wèn)我串述,道長(zhǎng),這世上最難降的妖魔是什么哥攘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任剖煌,我火速辦了婚禮,結(jié)果婚禮上逝淹,老公的妹妹穿的比我還像新娘耕姊。我一直安慰自己,他們只是感情好栅葡,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布茉兰。 她就那樣靜靜地躺著,像睡著了一般欣簇。 火紅的嫁衣襯著肌膚如雪规脸。 梳的紋絲不亂的頭發(fā)上坯约,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音莫鸭,去河邊找鬼闹丐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛被因,可吹牛的內(nèi)容都是我干的卿拴。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梨与,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼堕花!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起粥鞋,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缘挽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后呻粹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體壕曼,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年尚猿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窝稿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凿掂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纹蝴,到底是詐尸還是另有隱情庄萎,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布塘安,位于F島的核電站糠涛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏兼犯。R本人自食惡果不足惜忍捡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望切黔。 院中可真熱鬧砸脊,春花似錦、人聲如沸纬霞。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诗芜。三九已至瞳抓,卻和暖如春埃疫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孩哑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工栓霜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人横蜒。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓叙淌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親愁铺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹰霍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容