• <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>

            eXile 的專欄

            說說C++智能指針(1): 關于shared_ptr

               shared_ptr是新的標準庫的一個主要成員,作為一個非嵌入式的智能指針,其設計可謂已經是絞盡腦汁。當然,還有很多人對它提出了不滿。沒有完美的設計,只有合適的設計。

            1.
            shared_ptr最大的特點是接口的簡單性與實現的靈活性。
                對于shared_ptr<Object>,object的內存管理是可定制的,甚至可以定制引用計數結點的內存分配,以滿足對內存有特殊要求的情況。而這一切,都被
            Object的實現者隱藏起來,使用Object的客戶類是不用關心的。這和以前標準庫的組件實現策略有些不同。比如說, vector<int, A1>和vector<int, A2>,由于內存分配策略的不同,而變成類型的不同,造成接口的改變。這一點在shared_ptr的設計時被避免了,當然以一定的性能代價。shared_ptr作為C++面向對象設計的一個重要組件,接口的簡單性是很重要的,必須要有接口和實現的分離。與此相似的還有tr1::function的設計。

            2.在同一體系中,各種類型的智能指針可以互相轉換。

               如下例:

            struct Object : InterfaceA, InterfaceB {
                MemberA memberA;
            };


            shared_ptr
            <Object> obj(new Object);
            shared_ptr
            <InterfaceA> a = obj;
            shared_ptr
            <InterfaceB> b = obj;
            shared_ptr<Object> p = static_pointer_cast<Object>(b);
            shared_ptr<void> p2 = obj;


              甚至還可以取得數據成員的智能指針:

            shared_ptr<Object> obj(new Object);
            shared_ptr
            <MemberA> memberA(obj, &obj->memberA);


              再來說說shared_ptr的缺點。

            1.對于使用引用計數的智能指針來說,必須要小心出現循環引用。
                 在重度使用
            shared_ptr的系統中,你必須一開始就明確類與類的關系,以決定哪里使用shared_ptr,哪里使用weak_ptr,否則就會出現內存泄露。而shared_ptr的接口轉換的靈活性,也很容易導致智能指針被濫用。內存自動管理的問題并沒有得到解決,它只是被轉移了。

            2.shared_ptr使用非嵌入式設計,這樣可以使用于基本類型,比如 shared_ptr<int>。但是根據個人經驗,這種情況在很少使用。大部分情況還是使用自己設計的類。這有一個問題,就是沒有很方便的辦法實現this指針和智能指針的轉換。標準庫中提供了enable_shared_from_this類來解決這個問題。但這已經使所謂的非嵌入式設計徒有虛名。而假如一開始采用嵌入式設計的話,則在性能代價和多線程設計方面具有更大的靈活性。

            posted on 2009-11-02 17:38 eXile 閱讀(5059) 評論(2)  編輯 收藏 引用 所屬分類: C/C++編程與設計

            評論

            # re: 說說C++智能指針shared_ptr[未登錄] 2009-11-02 18:22 foxriver

            那么復雜。。對于數組,智能指針容易內存泄漏。實用性最重要,程序是要不斷維護的,一切從簡。。

            我用最簡版本,也過得滋潤瀟灑,KISS 原則。。


            // Quake4 SourceCode, this class is NOT safe for array new's. It will not
            // properly call the destructor for each element and you will silently leak memory.
            // it does work for classes requiring no destructor however(base types)
            template<typename T> class auto_ptr
            {
            public:
            explicit auto_ptr(T* ptr = 0) : m_ptr(ptr)
            {
            }

            ~auto_ptr()
            {
            delete m_ptr;
            }

            T& operator*() const { return *m_ptr; }
            T* operator->() const { return &**this; }

            private:
            // disallow copies
            auto_ptr<T>& operator=(auto_ptr<T>& ptr);
            auto_ptr(auto_ptr<T>& ptr);

            T* m_ptr;
            };

              回復  更多評論   

            # re: 說說C++智能指針shared_ptr 2009-11-02 19:13 zwp

            設計決定實現。
            當你真正需要用懂啊他的時候,你會了解并永遠記住他的優缺點。而不必事先就去單線使用哪個智能指針,每個智能指針的優缺點。  回復  更多評論   

            導航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            常用鏈接

            留言簿(18)

            隨筆分類

            隨筆檔案

            服務器編程

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲人AV永久一区二区三区久久| 国产精品无码久久综合网| 四虎国产精品免费久久久| 精品久久777| 久久中文字幕精品| 日本五月天婷久久网站| 久久精品国产99国产精品澳门| 日本久久久精品中文字幕| 久久久这里有精品中文字幕| 精品久久久久久久国产潘金莲| 久久SE精品一区二区| 国产高潮国产高潮久久久91 | 2021久久精品国产99国产精品| 国产巨作麻豆欧美亚洲综合久久| 久久久精品久久久久影院| 久久99精品久久只有精品 | 99久久婷婷国产综合精品草原| 99久久无色码中文字幕人妻| 99久久夜色精品国产网站| 一本色道久久99一综合| 久久狠狠一本精品综合网| 久久精品国产99国产精品澳门| 久久久久久久91精品免费观看| 国产精品成人精品久久久| 久久99毛片免费观看不卡 | 亚洲精品乱码久久久久久久久久久久| 久久精品三级视频| 久久久久亚洲AV无码麻豆| 久久久久99精品成人片欧美| 久久99热这里只频精品6| 国产免费久久精品99久久| 久久久中文字幕| 麻豆精品久久久一区二区| 久久精品国产福利国产秒| 97精品伊人久久大香线蕉app| 久久久久国产精品人妻| 伊人久久亚洲综合影院| 久久久亚洲AV波多野结衣| 久久精品国产欧美日韩99热| 国产精品一区二区久久精品涩爱| 一级做a爰片久久毛片毛片|