• <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无码专区首JN| 婷婷伊人久久大香线蕉AV| 久久久91精品国产一区二区三区 | 狠狠久久综合伊人不卡| 狠狠精品干练久久久无码中文字幕| 久久精品国产清自在天天线| 狠狠精品久久久无码中文字幕| 久久66热人妻偷产精品9| 久久综合狠狠色综合伊人| 亚洲精品99久久久久中文字幕 | 久久久久久国产a免费观看不卡| 99精品国产免费久久久久久下载| 色欲综合久久中文字幕网| 久久se精品一区精品二区国产| AV无码久久久久不卡蜜桃| 国产成人精品久久| 麻豆一区二区99久久久久| 人人狠狠综合久久亚洲| 久久久久国产一区二区三区| 日本WV一本一道久久香蕉| …久久精品99久久香蕉国产| 久久天天婷婷五月俺也去| 国产精品VIDEOSSEX久久发布| A狠狠久久蜜臀婷色中文网| 国内精品久久国产| 久久久久一本毛久久久| 久久99中文字幕久久| 久久天天躁狠狠躁夜夜96流白浆| 欧洲性大片xxxxx久久久| 国产成人综合久久久久久| 久久精品99久久香蕉国产色戒| 亚洲日本va午夜中文字幕久久 | 综合久久一区二区三区 | 久久ww精品w免费人成| 国产成人无码精品久久久性色 | 久久人人爽人人爽AV片| 久久国产高清一区二区三区| 国产成人无码精品久久久久免费| 国产成人久久777777| 国产精品gz久久久| 色诱久久av|