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

            隨筆分類

            隨筆檔案

            服務器編程

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久99国产精品尤物| 中文字幕无码精品亚洲资源网久久| 久久久午夜精品| 国内精品久久久久久久久| 狠狠狠色丁香婷婷综合久久俺| 亚洲国产精品无码久久久蜜芽 | 久久av无码专区亚洲av桃花岛| 午夜视频久久久久一区| 久久久久国产视频电影| 久久e热在这里只有国产中文精品99| 91久久精品国产成人久久| 国产亚州精品女人久久久久久| 久久精品无码一区二区日韩AV| 久久精品无码专区免费| 亚洲精品无码久久不卡| 热99RE久久精品这里都是精品免费 | 国产精品久久成人影院| 热99re久久国超精品首页| 国内精品久久九九国产精品| 99精品久久久久久久婷婷| 日本精品久久久久久久久免费| 国产精品久久久久久五月尺| 国内精品久久久久影院薰衣草| 香蕉久久av一区二区三区| 94久久国产乱子伦精品免费| 久久综合给合综合久久| 国产69精品久久久久9999APGF| 精品久久无码中文字幕| 久久国产热这里只有精品| 国产成人精品久久| 狠狠久久综合| 亚洲综合日韩久久成人AV| 91亚洲国产成人久久精品网址| 久久精品青青草原伊人| 国产精品va久久久久久久| 人妻丰满AV无码久久不卡| 热久久这里只有精品| 久久久久亚洲AV无码观看| 国产精品美女久久久久av爽| 久久夜色精品国产网站| 少妇被又大又粗又爽毛片久久黑人|