青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-22  評(píng)論-7  文章-0  trackbacks-0
Solmyr 的小品文系列之五:垃圾收集 轉(zhuǎn)自pchome
午餐時(shí)間。

zero 坐在餐桌前,機(jī)械的重復(fù)“夾菜 -> 咀嚼 -> 吞咽”的動(dòng)作序列,臉上用無形的大字寫著:我心不在焉。在他的對(duì)面坐著 Solmyr ,慢條斯理的吃著他那份午餐,維持著他一貫很有修養(yǎng)的形象 ——— 或者按照 zero 這些熟悉他本質(zhì)的人的說法:假象。

“怎么了 zero ?胃口不好么?”,基本填飽肚子之后,Solmyr 覺得似乎應(yīng)該關(guān)心一下他的學(xué)徒了。

“呃,沒什么,只是 …… Solmyr ,C++ 為什么不支持垃圾收集呢?(注:垃圾收集是一種機(jī)制,保證動(dòng)態(tài)分配了的內(nèi)存塊會(huì)自動(dòng)釋放,Java 等
語言支持這一機(jī)制。)”

Solmyr 嘆了口氣,用一種平靜的眼神盯著 zero :“是不是在 BBS 上和人吵 C++ 和 Java 哪個(gè)更好?而且吵輸了?我早告訴過你,這種爭論再無聊不過了。”

“呃 …… 是”,zero 不得不承認(rèn) ——— Solmyr 的眼神雖然一點(diǎn)也不銳利,但是卻莫名其妙的讓 zero 產(chǎn)生了微微的恐懼感。

“而且,誰告訴你 C++ 不支持垃圾收集的?”

“啊!Solmyr 你不是開玩笑吧?!”

“zero 你得轉(zhuǎn)變一下觀念。我問你,C++ 支不支持可以動(dòng)態(tài)改變大小的數(shù)組?”

“這 …… 好象也沒有吧?”

“那 vector 是什么東西?”

“呃 ……”

“支持一種特性,并不是說非得把這個(gè)特性加到語法里去,我們也可以選擇用現(xiàn)有的語言機(jī)制實(shí)現(xiàn)一個(gè)庫來支持這個(gè)特征。以垃圾收集為例,這里我們的任務(wù)是要保證每一個(gè)被動(dòng)態(tài)分配的內(nèi)存塊都能夠被釋放,也就是說 ……”,Solmyr 不知從哪里找出了一張紙、一支筆,寫到:

int* p = new int; // 1
delete p; // 2

“也就是說,對(duì)于每一個(gè) 1 ,我們要保證有一個(gè) 2 被調(diào)用,1 和 2 必須成對(duì)出現(xiàn)。我來問你,C++ 中有什么東西是由語言本身保證一定成對(duì)出現(xiàn)的?”

“……”,zero 露出了努力搜索記憶的表情,不過很明顯一無所獲。

“提示一下,和類的創(chuàng)建有關(guān)。”

“哦!構(gòu)造函數(shù)與析構(gòu)函數(shù)!”

“正確。可惜普通指針沒有構(gòu)造函數(shù)與析構(gòu)函數(shù),所以我們必須要寫一個(gè)類來加一層包裝,最簡單的就象這樣:”

class my_intptr
{
public:
int* m_p;

my_intptr(int* p){ m_p = p; }
~my_intptr(){ delete m_p; }
};

…………

my_intptr pi(new int);
*(pi.m_p) = 10;

…………

“這里我們可以放心的使用 my_intptr ,不用擔(dān)心內(nèi)存泄漏的問題:一旦 pi 這個(gè)變量被銷毀,我們知道 pi.p 指向的內(nèi)存塊一定會(huì)被釋放。不過如果每次使用 my_intptr 都得去訪問它的成員未免太麻煩了。為此,可以給這個(gè)類加上重載的 * 運(yùn)算符:”

class my_intptr
{
private:
int* m_p;

public:
my_intptr(int* p){ m_p = p; }
~my_intptr(){ delete m_p; }

int& operator*(){ return *m_p; }
};

…………

my_intptr pi;
*pi = 10;
int a = *pi;

…………

“現(xiàn)在是不是看起來 my_intptr 就像是一個(gè)真正的指針了?正因?yàn)槿绱耍@種技術(shù)被稱為智能指針。現(xiàn)在我問你,這個(gè)類還缺少哪些東西?”

zero 皺著眉頭,眼睛一眨一眨,看上去就像一臺(tái)慢速電腦正在辛苦的往它的硬盤上拷貝文件。良久,zero 抬起頭來,不太確定的說:“是不是還缺少一個(gè)拷貝構(gòu)造函數(shù)和一個(gè)賦值運(yùn)算符?”

“說說為什么。”,Solmyr 顯然不打算就這樣放過 zero。

“因?yàn)?…… 我記得沒錯(cuò)的話 …… 《50 誡 》(注:指《Effective C++ 2/e》一書)中提到過,如果你的類里面有指針指向動(dòng)態(tài)分配的內(nèi)存,那么一定要為它寫一個(gè)拷貝構(gòu)造函數(shù)和一個(gè)賦值運(yùn)算符 …… 因?yàn)?…… 否則的話,一旦你做了賦值,會(huì)導(dǎo)致兩個(gè)對(duì)象的指針指向同一塊內(nèi)存。對(duì)了!如果是上面的類,這樣一來會(huì)導(dǎo)致同一個(gè)指針被 delete 兩次!”

“正確。那么我們應(yīng)該怎樣來實(shí)現(xiàn)呢?”

“這簡單,我們用 memcpy 把目標(biāo)指針指向的內(nèi)存中的內(nèi)容拷貝過來。”

“如果我們的智能指針指向一個(gè)類的對(duì)象怎么辦?注意,類的對(duì)象中可能有指針,不能用 memcpy。”

“那 …… 我們用拷貝構(gòu)造的辦法。”

“如果我們的智能指針指向的對(duì)象不能拷貝構(gòu)造怎么辦?它可能有一個(gè)私有的拷貝構(gòu)造函數(shù)。”

“那 ……”,zero 頓了一頓,決定老實(shí)承認(rèn),“我不知道。”

“問題在哪你知道么?在于你沒有把智能指針看作指針。想象一下,如果我們對(duì)一個(gè)指針做賦值,它的含義是什么?”

“呃,我明白了,在這種情況下,應(yīng)該想辦法讓兩個(gè)智能指針指向同一個(gè)對(duì)象 …… 可是 Solmyr ,這樣以來豈不是仍然要對(duì)同一個(gè)對(duì)象刪除兩遍?”

“是的,我們得想辦法解決這 個(gè)問題,辦法不只一種。比較好的一種是為每個(gè)指針維護(hù)一個(gè)引用計(jì)數(shù)值,每次賦值或者拷貝構(gòu)造,就讓計(jì)數(shù)值加一,這意味著指向這個(gè)內(nèi)存塊的智能指針又多了一 個(gè);而每有一個(gè)智能指針被銷毀,就讓計(jì)數(shù)值減一,這意味著指向這個(gè)內(nèi)存塊的智能指針少了一個(gè);一旦計(jì)數(shù)值為 0 ,就釋放內(nèi)存塊。象這樣:”

class my_intptr
{
private:
int* m_p;
int* m_count;

public:
my_intptr(int* p)
{
m_p = p;
m_count = new int; // 初始化計(jì)數(shù)值為 1
*m_count = 1;
}
my_intptr(const my_intptr& rhs) // 拷貝構(gòu)造函數(shù)
{
m_p = rhs.m_p; // 指向同一塊內(nèi)存
m_count = rhs.m_count; // 使用同一個(gè)計(jì)數(shù)值
(*m_count)++; // 計(jì)數(shù)值加 1
}
~my_intptr()
{
(*m_count)--; // 計(jì)數(shù)值減 1
if( *m_count == 0 ) // 已經(jīng)沒有別的指針指向該內(nèi)存塊了
{
delete m_p;
delete m_count;
}
}

my_intptr& operator=(const my_intptr& rhs)
{
if( m_p == rhs.m_p ) // 首先判斷是否本來就指向同一內(nèi)存塊
return *this; // 是則直接返回

(*m_count)--; // 計(jì)數(shù)值減 1 ,因?yàn)樵撝羔槻辉僦赶蛟瓉韮?nèi)存塊了
if( *m_count == 0 ) // 已經(jīng)沒有別的指針指向原來內(nèi)存塊了
{
delete m_p;
delete m_count;
}

m_p = rhs.m_p; // 指向同一塊內(nèi)存
m_count = rhs.m_count; // 使用同一個(gè)計(jì)數(shù)值
(*m_count)++; // 計(jì)數(shù)值加 1
}

…………
};

“其他部分沒有什么太大變化,我不費(fèi)事了。現(xiàn)在想象一下我們?cè)鯓邮褂眠@種智能指針?”,Solmyr 放下了筆,再次拿起了筷子,有些惋惜的發(fā)現(xiàn)他愛吃的肉丸子已經(jīng)冷了。

zero 想象著,有些遲疑。“我們 …… 可以用 new int 表達(dá)式作為構(gòu)造函數(shù)的參數(shù)來構(gòu)造一個(gè)智能指針,然后 …… 然后我們可以任意的賦值,”,他開始抓住了思路,越說越快,“任意的用已經(jīng)存在的智能指針來構(gòu)造新的智能指針,智能指針的賦值運(yùn)算符、拷貝構(gòu)造函數(shù)和析構(gòu) 會(huì)保證計(jì)數(shù)值始終等于指向該內(nèi)存塊的智能指針數(shù)。”zero 似乎明白了他看到了怎樣的功能, 開始激動(dòng)起來:“然后一旦計(jì)數(shù)值為 0 被分配的內(nèi)存塊就會(huì)釋放!也就是說 …… 有指針指向內(nèi)存塊,它就不釋放,一旦沒有,它就自動(dòng)釋放!太棒了!我們只要一開始正確的初始化智能指針,就可以象普通指針那樣使用它,而且完全不用擔(dān)心內(nèi) 存釋放的問題!太棒了!”zero 激動(dòng)的大叫:“這就是垃圾收集!Solmyr !我們?cè)陲堊郎蠈?shí)現(xiàn)了一個(gè)垃圾收集器!”

Solmyr 很明顯沒有分享 zero 的激動(dòng):“我在吃飯,你能不能不要大叫‘飯桌上實(shí)現(xiàn)了一個(gè)垃圾收集器’這種倒胃口的話?”頓了一頓,Solmyr 帶著他招牌式的壞笑,以一種可惡的口吻說道:“而且請(qǐng)注意一下自己的形象。”

“嗯?”,zero 回過神來,發(fā)現(xiàn)自己不知什么時(shí)候站了起來,而整個(gè)餐廳里的人都在看著他嘿嘿偷笑,這讓他感覺自己像個(gè)傻瓜。

zero 紅著臉坐下,壓低了聲音問 Solmyr :“不過 Solmyr ,這確實(shí)是一個(gè)的垃圾收集機(jī)制啊,只要我們把這個(gè)類改成 …… 嗯 …… 改成模板類,象這樣:”zero 抓過了紙筆,寫到:

template <typename T>
class my_ptr
{
private:
T* m_p;
int* m_count;
…………
};

“它不就能支持任意類型的指針了嗎?我們就可以把它用在任何地方。”

Solmyr 搖了搖頭:“不,你把問題想的太簡單了。對(duì)于簡單的類型,這個(gè)類確實(shí)可以處理的很好,但實(shí)際情況是很復(fù)雜的。考慮一個(gè)典型情況:類 Derived 是類 Base 的派生類,我們希望這樣賦值:”

Base* pb;
Derived pd;
…………
pb = pd;

“你倒說說看,這種情況,怎樣改用上面這個(gè)智能指針來處理?”

“……”,zero 沉默了。

“要實(shí)現(xiàn)一個(gè)完整的垃圾收集機(jī)制并不容易,因?yàn)橛性S多細(xì)節(jié)要考慮。”,Solmyr 開始總結(jié)了,“不過,基本思路就是上面說的這些。值得慶幸的是,目前已經(jīng)有了一個(gè)相當(dāng)成熟的‘引用計(jì)數(shù)’智能指針,boost::shared_ptr。 大多數(shù)情況下,我們都可以使用它。另外,除了智能指針之外,還有一些技術(shù)也能夠幫助我們避開釋放內(nèi)存的問題,比如內(nèi)存池。但是,關(guān)鍵在于 ——— ”

Solmyr 再度用那種平靜的眼神盯著 zero :

“身為 C/C++ 程序員,必須有創(chuàng)造力。那種躺在語言機(jī)制上不思進(jìn)取的人,那種必須要靠語法強(qiáng)制才知道怎樣編程的人,那種沒有別人告訴他該干什么就無所適從的人,不適合這門語言。
posted on 2010-04-13 17:36 楚天清秋 閱讀(290) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C,C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品久久久久久久男人的天堂 | 久久这里有精品15一区二区三区| 亚洲精品在线三区| 亚洲黄色影片| 亚洲激情一区二区| 亚洲特黄一级片| 亚洲性图久久| 欧美影院视频| 免费美女久久99| 欧美日韩直播| 国内精品亚洲| 一区二区免费在线观看| 亚洲欧美激情诱惑| 久色成人在线| 一区二区免费看| 久久动漫亚洲| 欧美日韩国产小视频| 国产精品自在欧美一区| 亚洲第一成人在线| 亚洲中字黄色| 欧美电影在线播放| 一二三区精品| 久久在精品线影院精品国产| 欧美日韩高清在线一区| 国产自产2019最新不卡| 一区二区三区**美女毛片| 久久国产日本精品| 亚洲电影第三页| 制服丝袜亚洲播放| 美女精品国产| 欧美香蕉视频| 亚洲精品乱码久久久久| 欧美在线3区| 亚洲乱码国产乱码精品精 | 99这里只有精品| 久久黄色级2电影| 国产精品久久久久av免费| 亚洲国产精品久久| 久久精品2019中文字幕| 国产精品h在线观看| 国语精品中文字幕| 欧美精选午夜久久久乱码6080| 亚洲一级二级在线| 久久爱www久久做| 国产精品99一区二区| 在线精品国产成人综合| 午夜伦理片一区| 亚洲精品乱码久久久久久蜜桃91| 久久大逼视频| 国产欧美一区二区三区另类精品| 99视频精品在线| 猛男gaygay欧美视频| 性一交一乱一区二区洋洋av| 欧美性片在线观看| 亚洲深夜福利网站| 99精品视频免费观看| 亚洲国产美国国产综合一区二区| 久久久999精品视频| 欧美二区在线播放| 亚洲青涩在线| 亚洲国产精品久久久久秋霞不卡| 久久亚洲私人国产精品va| 国内精品久久久久影院 日本资源| 亚洲影视在线| 亚洲在线观看视频| 国产一区二区三区久久久| 欧美一区二区三区视频在线观看 | 亚洲国产精品久久久久秋霞不卡 | 嫩草成人www欧美| 久久久美女艺术照精彩视频福利播放| 国产欧美一区二区精品性 | 一区二区三区久久久| 欧美视频福利| 久久疯狂做爰流白浆xx| 久久先锋资源| 一区二区三区在线免费播放| 久久全球大尺度高清视频| 欧美在线视屏| 亚洲国产精品久久人人爱蜜臀| 蜜桃视频一区| 欧美国产国产综合| 午夜激情综合网| 久久精品综合网| 亚洲精品自在久久| 亚洲午夜国产一区99re久久| 国产亚洲激情在线| 亚洲国产精品尤物yw在线观看 | 正在播放亚洲| 国产一区二区三区成人欧美日韩在线观看 | 亚洲第一区色| 欧美日韩精品伦理作品在线免费观看| 亚洲综合色自拍一区| 欧美日韩在线不卡一区| 欧美一区二区观看视频| 久久精品国产69国产精品亚洲| 亚洲黑丝在线| 亚洲一区亚洲| 亚洲激情二区| 午夜精品短视频| 亚洲精品国产无天堂网2021| 亚洲午夜精品福利| 亚洲观看高清完整版在线观看| 一本大道久久a久久综合婷婷| 国模精品一区二区三区| 亚洲精品欧洲| 尤妮丝一区二区裸体视频| 一区二区三区国产在线| 在线免费观看成人网| 亚洲一区二区三区影院| 亚洲激情在线视频| 欧美在线999| 国产精品99久久久久久久vr| 久久国产精品久久国产精品| 一区二区欧美激情| 免费欧美电影| 噜噜噜91成人网| 国产欧美一区二区白浆黑人| 91久久久亚洲精品| 亚洲第一主播视频| 久久国产精品毛片| 久久国产精品免费一区| 欧美视频不卡中文| 亚洲精品一区二区三区福利| 亚洲高清在线| 午夜久久一区| 欧美成人精品不卡视频在线观看 | 久久婷婷国产综合尤物精品| 亚洲欧美日韩综合| 欧美精品在线观看| 亚洲国产成人午夜在线一区| 极品日韩久久| 久久久久久电影| 久久嫩草精品久久久久| 国产欧美欧美| 亚洲综合三区| 欧美中文字幕在线播放| 国产精品美女久久久久久免费| 日韩一级黄色大片| 一本久久青青| 欧美日韩亚洲一区二区| 亚洲精品一区中文| 亚洲香蕉在线观看| 国产精品视频1区| 西西人体一区二区| 久久精品亚洲国产奇米99| 国产丝袜一区二区三区| 欧美一区二区国产| 久久综合狠狠综合久久激情| 黄色精品在线看| 男男成人高潮片免费网站| 亚洲国产天堂久久综合网| 99在线精品观看| 欧美午夜不卡影院在线观看完整版免费| 亚洲九九爱视频| 欧美一区二区日韩| 国语自产精品视频在线看一大j8| 久久免费的精品国产v∧| 亚洲成色999久久网站| 一本大道久久a久久精品综合| 欧美日韩亚洲成人| 午夜宅男欧美| 欧美激情第三页| 亚洲在线一区二区| 韩日精品视频| 欧美日韩国产综合视频在线| 亚洲欧美欧美一区二区三区| 欧美11—12娇小xxxx| 99日韩精品| 国产午夜精品全部视频播放| 麻豆久久久9性大片| 9色精品在线| 久久视频一区二区| 亚洲一区二区精品在线观看| 国产一区欧美日韩| 欧美日本高清视频| 久久久久久久综合| 一本色道久久综合亚洲精品按摩 | 国产欧美一区二区三区久久人妖 | 国产精品久久久对白| 久久成人精品视频| 日韩视频精品在线| 免费不卡亚洲欧美| 性欧美大战久久久久久久久| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲视频在线一区观看| 国产字幕视频一区二区| 欧美激情在线狂野欧美精品| 亚洲主播在线观看| 亚洲国产精品专区久久| 久久精品欧美| 亚洲欧美影院| av成人老司机| 最新日韩在线| 韩国免费一区| 国产精品高清免费在线观看| 男男成人高潮片免费网站| 久久国产乱子精品免费女| 亚洲欧美激情视频在线观看一区二区三区 | 欧美激情一区| 裸体一区二区三区|