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

天下

記錄修行的印記

C++ RAII

 

C++ RAII

    RAII是resource acquisition 
is initialization的縮寫,意為“資源獲取即初始化”。它是C++之父Bjarne Stroustrup提出的設(shè)計(jì)理念,其核心是把資源和對象的生命周期綁定,對象創(chuàng)建獲取資源,對象銷毀釋放資源。在RAII的指導(dǎo)下,C++把底層的資源管理問題提升到了對象生命周期管理的更高層次。
    說起來,RAII的含義倒也不算復(fù)雜。用白話說就是:在類的構(gòu)造函數(shù)中分配資源,在析構(gòu)函數(shù)中釋放資源。這樣,當(dāng)一個(gè)對象創(chuàng)建的時(shí)候,構(gòu)造函數(shù)會自動地被調(diào)用;而當(dāng)這個(gè)對象被釋放的時(shí)候,析構(gòu)函數(shù)也會被自動調(diào)用。于是乎,一個(gè)對象的生命期結(jié)束后將會不再占用資源,資源的使用是安全可靠的。
C
++ RAII體現(xiàn)出了簡潔、安全、實(shí)時(shí)的特點(diǎn):

1.概念簡潔性:讓資源(包括內(nèi)存和非內(nèi)存資源)和對象的生命周期綁定,資源類的設(shè)計(jì)者只需用在類定義內(nèi)部處理資源問題,提高了程序的可維護(hù)性
2.類型安全性:通過資源代理對象包裝資源(指針變量),并利用運(yùn)算符重載提供指針運(yùn)算方便使用,但對外暴露類型安全的接口
3.異常安全性:棧語義保證對象析構(gòu)函數(shù)的調(diào)用,提高了程序的健壯性
4.釋放實(shí)時(shí)性:和GC相比,RAII達(dá)到了和手動釋放資源一樣的實(shí)時(shí)性,因此可以承擔(dān)底層開發(fā)的重任

也許你還在驚訝RAII如此簡單的時(shí)候,關(guān)于RAII的主要內(nèi)容已經(jīng)介紹完了。簡單不意味著簡陋,在我看來RAII雖然不像GC一樣,是一套具體的機(jī)制,但它蘊(yùn)含的對象與資源關(guān)系的哲學(xué)深度的理解卻使得我對Bjarne Stroustrup肅然起敬!

最后,不得不提醒RAII的理念固然簡單,不過在具體實(shí)現(xiàn)的時(shí)候仍有需要小心的地方。比如對于STL的auto_ptr,可以視為資源的代理對象,auto_ptr對象間的賦值是一個(gè)需要特別注意的地方。簡單說來資源代理對象間賦值的語義不滿足“賦值相等”,其語義是資源管理權(quán)的轉(zhuǎn)移。

什么是“賦值相等”呢?比如:

int a;  int b = 10;  a = b; //這句話執(zhí)行后 a == b 但對于資源代理對象,這是不滿足的,比如:

auto_ptr
<int> a(null);  auto_ptr<int> b(new int(123));  a = b; //這句話執(zhí)行后a != b,賦值的語義是b把資源的管理權(quán)交給了a 

auto_ptr是這樣一種指針:它是“它所指向的對象”的擁有者。這種擁有具有唯一性,即一個(gè)對象只能有一個(gè)擁有者,嚴(yán)禁一物二主。當(dāng)auto_ptr指針被摧毀時(shí),它所指向的對象也將被隱式銷毀,即使程序中有異常發(fā)生,auto_ptr所指向的對象也將被銷毀。


關(guān)于auto_ptr的幾種注意事項(xiàng):
1、auto_ptr不能共享所有權(quán)。
2、auto_ptr不能指向數(shù)組
3、auto_ptr不能作為容器的成員。
4、不能通過賦值操作來初始化auto_ptr
std::auto_ptr
<int> p(new int(42));     //OK
std::auto_ptr<int> p = new int(42);    //ERROR
這是因?yàn)閍uto_ptr 的構(gòu)造函數(shù)被定義為了explicit
5、不要把a(bǔ)uto_ptr放入容器

下面便是在C
++中實(shí)現(xiàn)RAII的典型代碼:
class file
{
public:
    file(
string const& name) {
        m_fileHandle
=fopen(name.cstr());
    }
    
~file() {
        fclose(m_fileHandle);
    }
    
//
private:
    handle m_fileHandle;
}

很典型的“在構(gòu)造函數(shù)里獲取,在析構(gòu)函數(shù)里釋放”。如果我寫下代碼:   
void fun1() {
    file myfile(
"my.txt");
     
//操作文件
//此處銷毀對象,調(diào)用析構(gòu)函數(shù),釋放資源
當(dāng)函數(shù)結(jié)束時(shí),局部對象myfile的生命周期也結(jié)束了,析構(gòu)函數(shù)便會被調(diào)用,資源會得到釋放。而且,如果函數(shù)中的代碼拋出異常,那么析構(gòu)函數(shù)也會被調(diào)用,資源同樣會得到釋放。所以,在RAII下,不僅僅資源安全,也是異常安全的。

但是,在如下的代碼中,資源不是安全的,盡管我們實(shí)現(xiàn)了RAII:
void fun2() {
    file pfile
=new file("my.txt");
     
//操作文件
}
因?yàn)槲覀冊诙焉蟿?chuàng)建了一個(gè)對象(通過new),但是卻沒有釋放它。我們必須運(yùn)用delete操作符顯式地加以釋放:
void fun3() {
    file pfile
=new file("my.txt");
     
//操作文件
        delete pfile;
}
否則,非但對象中的資源得不到釋放,連對象本身的內(nèi)存也得不到回收。(將來,C
++的標(biāo)準(zhǔn)中將會引入GC(垃圾收集),但正如下面分析的那樣,GC依然無法確保資源的安全)。
現(xiàn)在,在fun3(),資源是安全的,但卻不是異常安全的。因?yàn)橐坏┖瘮?shù)中拋出異常,那么delete pfile;這句代碼將沒有機(jī)會被執(zhí)行。

C
++領(lǐng)域的諸位大牛們告誡我們:如果想要在沒有GC的情況下確保資源安全和異常安全,那么請使用智能指針:
void fun4() {
    auto_ptr
<file> spfile(new file("my.txt"));
     
//操作文件
//此處,spfile結(jié)束生命周期的時(shí)候,會釋放(delete)對象
那么,智能指針又是怎么做到的呢?下面的代碼告訴你其中的把戲(關(guān)于智能指針的更進(jìn)一步的內(nèi)容,請參考std::auto_ptr,boost或shared_ptr的智能指針)。
也就是說,智能指針通過RAII來確保內(nèi)存資源的安全,也間接地使得對象上的RAII得到實(shí)施。不過,這里的RAII并不是十分嚴(yán)格:對象(所占的內(nèi)存也是資源)的創(chuàng)建(資源獲?。┦窃跇?gòu)造函數(shù)之外進(jìn)行的。廣義上,我們也把它劃歸RAII范疇。
但是,Matthew Wilson在《Imperfect C
++》一書中,將其獨(dú)立出來,稱其為RRID(Resource Release Is Destruction)。
RRID的實(shí)施需要在類的開發(fā)者和使用者之間建立契約,采用相同的方法獲取和釋放資源。比如,如果在shared_ptr構(gòu)造時(shí)使用malloc(),便會出現(xiàn)問題,因?yàn)閟hared_ptr是通過delete釋放對象的。

posted on 2011-03-22 14:25 天下 閱讀(9450) 評論(0)  編輯 收藏 引用 所屬分類: C/C++ 、C++必殺技法

<2011年3月>
272812345
6789101112
13141516171819
20212223242526
272829303112
3456789

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(4)

隨筆分類(378)

隨筆檔案(329)

鏈接

最新隨筆

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲性色视频| 久久精品国产精品亚洲综合| 亚洲美女淫视频| 欧美综合二区| 日韩一级黄色大片| 欧美精品自拍| 91久久在线播放| 男女av一区三区二区色多| 亚洲欧美日韩专区| 国产精品久久久免费| 亚洲一区二区三区激情| 亚洲国产一区二区三区在线播| 一区二区免费在线观看| 欧美日韩国产色视频| 亚洲精品免费网站| 亚洲激情欧美激情| 欧美精品一二三| 99精品国产99久久久久久福利| 欧美好骚综合网| 毛片一区二区三区| 91久久精品一区| 亚洲人成网站精品片在线观看| 牛牛国产精品| 日韩视频专区| 亚洲视频电影图片偷拍一区| 欧美视频一区二区在线观看| 亚洲视频国产视频| 亚洲一区二区三区四区中文| 免费成人网www| 噜噜噜久久亚洲精品国产品小说| 国外成人在线视频| 美女91精品| 欧美成ee人免费视频| 亚洲人成网站色ww在线| 99这里只有久久精品视频| 欧美三级午夜理伦三级中文幕| 先锋影院在线亚洲| 欧美在线资源| 亚洲精品一二| 亚洲小视频在线观看| 狠狠色丁香婷婷综合| 亚洲第一精品夜夜躁人人爽| 欧美日韩成人激情| 欧美一区激情| 鲁大师影院一区二区三区| 一本色道久久综合亚洲二区三区| 一区二区三区产品免费精品久久75 | 欧美色欧美亚洲高清在线视频| 亚洲一区三区电影在线观看| 久久精品论坛| 一本色道久久综合狠狠躁篇的优点 | 亚洲免费视频网站| 在线观看的日韩av| 亚洲日韩欧美视频一区| 国产精品自拍视频| 亚洲第一主播视频| 国产日本欧美一区二区三区| 免费成人高清| 国产精品日产欧美久久久久| 欧美激情第二页| 国产精品资源| 日韩视频一区二区三区在线播放| 国产亚洲午夜| 一本久久综合亚洲鲁鲁| 在线视频成人| 香蕉成人久久| 亚洲制服av| 欧美激情欧美狂野欧美精品| 久久久精品国产一区二区三区| 欧美全黄视频| 国产一区二区精品丝袜| 亚洲国产欧美一区| 狠狠色狠狠色综合| 午夜精品美女自拍福到在线 | 欧美一区二区三区四区视频| 麻豆精品视频在线观看视频| 香蕉成人久久| 欧美裸体一区二区三区| 免费观看成人网| 国产一区二区日韩精品| 一卡二卡3卡四卡高清精品视频| 亚洲国产精品va在线看黑人| 午夜久久久久| 欧美一区二区三区四区在线观看| 欧美精品在线观看| 亚洲国产高清在线观看视频| 亚洲欧洲一区| 麻豆91精品| 免费人成网站在线观看欧美高清| 国产日韩欧美二区| 午夜欧美大尺度福利影院在线看| 亚洲网站在线播放| 欧美日韩国产在线一区| 亚洲三级视频| 一区二区欧美在线| 欧美日本韩国在线| 亚洲三级色网| 亚洲视频在线观看三级| 欧美日韩一区三区四区| 一区二区三区高清在线| 亚洲免费av观看| 欧美日韩小视频| 在线亚洲自拍| 欧美综合77777色婷婷| 国产一区二区精品| 久久久久**毛片大全| 久久夜色精品国产欧美乱| 国产一级揄自揄精品视频| 久久国产福利国产秒拍| 免费成人在线视频网站| 亚洲国产精品va在线看黑人动漫| 麻豆精品在线观看| 野花国产精品入口| 欧美一区二区三区喷汁尤物| 亚洲精品免费在线播放| 欧美在线观看视频一区二区| 亚洲色无码播放| 欧美怡红院视频| 国产精品成人在线观看| 亚洲一区二区三区视频| 亚洲国产欧美一区二区三区久久 | 欧美日韩国产综合视频在线观看中文| 欧美日韩亚洲不卡| 激情91久久| 亚洲国产欧美日韩| 欧美在线看片| 亚洲三级视频| 91久久精品国产| 亚洲午夜小视频| 美女视频黄免费的久久| 欧美女同视频| 香蕉尹人综合在线观看| av72成人在线| 欧美国产在线观看| 亚洲第一伊人| 欧美在线一级视频| 日韩午夜电影在线观看| 国产亚洲欧美aaaa| 另类人畜视频在线| 亚洲视频碰碰| 美国成人直播| 一区二区免费在线观看| 韩国av一区二区三区在线观看| 欧美成人日本| 欧美专区在线| 亚洲伦理中文字幕| 你懂的视频一区二区| 亚洲欧美日韩一区二区三区在线| 亚洲国产高清在线观看视频| 国产精品三级视频| 欧美美女bbbb| 免费亚洲电影| 久久精品夜色噜噜亚洲a∨| 亚洲少妇诱惑| 亚洲人妖在线| 麻豆精品国产91久久久久久| 亚洲一区精彩视频| 99人久久精品视频最新地址| 在线观看欧美精品| 国产午夜亚洲精品理论片色戒| 欧美日韩精品免费在线观看视频| 久久精品中文字幕一区二区三区| 日韩一区二区精品视频| 欧美高清视频一区二区三区在线观看| 亚洲一区二区三区中文字幕在线| 亚洲国产欧美一区二区三区同亚洲 | 欧美日本韩国| 免费看av成人| 国产精品国产三级国产专播精品人| 免费成人你懂的| 久久蜜桃资源一区二区老牛| 一二三四社区欧美黄| 国产欧美在线观看一区| 欧美电影在线播放| 欧美韩日精品| 久久久久久亚洲精品不卡4k岛国| 亚洲影视在线播放| 蜜桃av一区二区| 女人天堂亚洲aⅴ在线观看| 久久久久久穴| 久久久久一区二区三区| 久久裸体视频| 欧美一区在线直播| 久久精品国产99| 亚洲嫩草精品久久| 性欧美长视频| 欧美一区二区三区视频| 亚洲一区二区三区在线播放| 亚洲一区二区三区色| 国产精品99久久99久久久二8| 夜夜爽99久久国产综合精品女不卡| 在线精品视频在线观看高清| 91久久精品美女高潮| aa亚洲婷婷| 一区二区毛片| 久久久久久久久岛国免费| 久久精品视频播放| 欧美成人激情视频免费观看| 亚洲欧美精品在线| 久久久蜜臀国产一区二区|