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

天下

記錄修行的印記

C++ RAII

 

C++ RAII

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

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

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

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

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

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

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

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


關于auto_ptr的幾種注意事項:
1、auto_ptr不能共享所有權。
2、auto_ptr不能指向數組
3、auto_ptr不能作為容器的成員。
4、不能通過賦值操作來初始化auto_ptr
std::auto_ptr
<int> p(new int(42));     //OK
std::auto_ptr<int> p = new int(42);    //ERROR
這是因為auto_ptr 的構造函數被定義為了explicit
5、不要把auto_ptr放入容器

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

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

但是,在如下的代碼中,資源不是安全的,盡管我們實現了RAII:
void fun2() {
    file pfile
=new file("my.txt");
     
//操作文件
}
因為我們在堆上創建了一個對象(通過new),但是卻沒有釋放它。我們必須運用delete操作符顯式地加以釋放:
void fun3() {
    file pfile
=new file("my.txt");
     
//操作文件
        delete pfile;
}
否則,非但對象中的資源得不到釋放,連對象本身的內存也得不到回收。(將來,C
++的標準中將會引入GC(垃圾收集),但正如下面分析的那樣,GC依然無法確保資源的安全)。
現在,在fun3(),資源是安全的,但卻不是異常安全的。因為一旦函數中拋出異常,那么delete pfile;這句代碼將沒有機會被執行。

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

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

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

導航

統計

常用鏈接

留言簿(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>
            欧美国产精品一区| 先锋影音国产精品| 欧美激情亚洲综合一区| 欧美一级午夜免费电影| 亚洲一区二区三区精品动漫| 在线一区二区日韩| 亚洲欧美国产高清va在线播| 欧美一区二区在线免费播放| 久久综合久久综合久久综合| 免费日本视频一区| 亚洲国产高潮在线观看| 麻豆精品视频在线观看| 欧美激情久久久| 夜夜嗨网站十八久久| 亚洲综合电影| 久久最新视频| 欧美小视频在线观看| 国内成+人亚洲| 亚洲精品日韩综合观看成人91| a91a精品视频在线观看| 欧美一区二区视频观看视频| 欧美成人免费视频| 亚洲视频国产视频| 老司机aⅴ在线精品导航| 欧美日韩成人在线视频| 狠狠色狠狠色综合日日tαg | 亚洲女ⅴideoshd黑人| 久久er精品视频| 欧美精品一区二区三区蜜桃| 国产精品一区二区久激情瑜伽| 1000部国产精品成人观看 | 欧美chengren| 制服丝袜激情欧洲亚洲| 久久精品麻豆| 国产精品对白刺激久久久| 亚洲黄页视频免费观看| 久久国产一二区| 一二三四社区欧美黄| 老司机精品福利视频| 国产欧美日韩亚洲精品| 在线亚洲国产精品网站| 欧美高清在线视频| 久久激情网站| 国产欧美日韩免费看aⅴ视频| 亚洲视频香蕉人妖| 亚洲欧洲一级| 欧美高潮视频| 亚洲人成网站999久久久综合| 久久全国免费视频| 小黄鸭精品aⅴ导航网站入口| 欧美日韩国产一级| 日韩视频在线永久播放| 欧美多人爱爱视频网站| 久久久久www| 国产综合亚洲精品一区二| 欧美怡红院视频| 久久精品国产77777蜜臀| 99视频精品全部免费在线| 欧美猛交免费看| 夜夜嗨av一区二区三区网页| 亚洲国产一区二区三区青草影视| 久久亚洲精品中文字幕冲田杏梨 | 欧美va亚洲va香蕉在线| 在线免费观看成人网| 欧美阿v一级看视频| 看片网站欧美日韩| 亚洲日本va在线观看| 91久久在线播放| 欧美丝袜一区二区| 午夜精品久久久久久99热| 亚洲午夜羞羞片| 国产亚洲精品aa| 免费观看欧美在线视频的网站| 麻豆av一区二区三区久久| 亚洲精品一区二区三区四区高清| 亚洲精品美女在线观看| 国产精品久久久久久久久久ktv| 亚洲一区二区三区视频| 亚洲男人的天堂在线aⅴ视频| 狠狠色丁香久久综合频道| 亚洲高清久久久| 欧美系列电影免费观看| 久久夜精品va视频免费观看| 农村妇女精品| 午夜精品亚洲一区二区三区嫩草| 午夜精品影院在线观看| 亚洲国产成人在线| 一本色道久久88综合亚洲精品ⅰ | 久久av一区| 久久天天狠狠| 99精品视频免费观看视频| 亚洲一区二区三区四区中文| 狠狠干综合网| 99在线精品视频在线观看| 国产嫩草影院久久久久| 亚洲高清在线观看| 国产精品久久久久久亚洲毛片 | **欧美日韩vr在线| 99视频日韩| 亚洲成色精品| 亚洲一区二区视频在线观看| 亚洲第一精品夜夜躁人人躁| 一本色道久久88亚洲综合88| 亚洲电影在线免费观看| 亚洲视频免费| 亚洲精品一级| 欧美在线www| 亚洲综合99| 欧美国产精品专区| 老司机久久99久久精品播放免费| 欧美三区免费完整视频在线观看| 免费亚洲电影在线| 久久精品一二三区| 亚洲欧美日本在线| 欧美成人一二三| 久久riav二区三区| 欧美日韩精品一区二区| 欧美激情精品久久久久久久变态| 国产中文一区二区| 亚洲小说欧美另类婷婷| 夜夜嗨av一区二区三区中文字幕 | 久久一区二区三区国产精品| 国产精品ⅴa在线观看h| 欧美激情片在线观看| 韩国av一区二区| 午夜精品免费视频| 午夜亚洲性色视频| 国产精品理论片| 中日韩高清电影网| 亚洲午夜女主播在线直播| 欧美精品观看| 亚洲精品免费网站| 国产精品99久久久久久久vr| 欧美美女bb生活片| 一区二区日韩免费看| 亚洲一级黄色片| 国产精品黄页免费高清在线观看| 99精品欧美一区二区三区综合在线| 亚洲乱码国产乱码精品精天堂 | 国产亚洲高清视频| 亚洲夜晚福利在线观看| 亚洲影音一区| 国产精品家庭影院| 亚洲一区二区三区免费视频| 欧美一级艳片视频免费观看| 国产亚洲精品久久久久动| 欧美亚洲一区二区三区| 久久午夜视频| 亚洲黄色影片| 欧美日韩精品中文字幕| 亚洲天堂视频在线观看| 性8sex亚洲区入口| 合欧美一区二区三区| 久久久一二三| 亚洲欧洲综合另类| 亚洲一区二区精品在线观看| 国产女主播一区二区| 久久精品亚洲乱码伦伦中文| 欧美激情中文字幕乱码免费| 一本色道久久综合亚洲精品不| 国产精品成人播放| 久久本道综合色狠狠五月| 欧美韩日精品| 亚洲欧美一区二区三区久久| 黑丝一区二区| 欧美日韩精品久久久| 午夜欧美大片免费观看| 亚洲第一区在线观看| 亚洲欧美视频在线观看| 伊人久久婷婷色综合98网| 欧美日韩mv| 久久久av毛片精品| 99天天综合性| 欧美激情视频一区二区三区免费| 亚洲一区二区在线观看视频| 狠狠色狠狠色综合日日五| 欧美日韩免费一区二区三区视频 | 久久久久久久久久久久久9999| 亚洲国产视频a| 欧美大片91| 亚洲视频自拍偷拍| 欧美成人一区二区| 亚洲欧美在线一区二区| 亚洲国产精品999| 国产精品夜夜夜| 欧美国产精品中文字幕| 欧美在线短视频| 亚洲视频二区| 亚洲乱亚洲高清| 麻豆精品在线视频| 欧美一级淫片aaaaaaa视频| 亚洲人成网在线播放| 国内一区二区三区| 国产精品国产福利国产秒拍| 女主播福利一区| 久久精品国产v日韩v亚洲 | 激情成人综合| 国产精品久久久99| 欧美精品一区二| 欧美1区2区|