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

            colorful

            zc qq:1337220912

             

            why enable_shared_from_this

             為什么會有 tr1::enable_shared_from_this 這個類,一直不解,直到看了Stephan T. Lavavej給出的關于shared_ptr 的PPT。 Stephan T. Lavavej是Visual C++ Libraries Developer。

            他給的例子是:

            struct Ansible {
                shared_ptr<Ansible> get_shared() {
                    shared_ptr<Ansible> ret(this);
                    return ret;
                }
            };

            int main() {
                shared_ptr<Ansible> a(new Ansible);
                Ansible& r = *a;
                shared_ptr<Ansible> b = r.get_shared();
            }

            Result: DOUBLE DELETION


            然后使用enable_shared_from_this 就對了:

            struct Ansible
                : public enable_shared_from_this<Ansible> { };

            int main() {
                shared_ptr<Ansible> a(new Ansible);
                Ansible& r = *a;
                shared_ptr<Ansible> b = r.shared_from_this();
            }

            a and b share ownership, as if:
            shared_ptr<Ansible> b = a;



            為什么?看看enable_shared_from_this 的實現://也可看boost

            template<class _Ty> class enable_shared_from_this
             { // provide member functions that create shared_ptr to this
            public:
             typedef _Ty _EStype;

             shared_ptr<_Ty> shared_from_this()
              { // return shared_ptr
              return shared_ptr<_Ty>(_Wptr);
              }

             shared_ptr<const _Ty> shared_from_this() const
              { // return shared_ptr
              return shared_ptr<const _Ty>(_Wptr);
              }

            protected:
             enable_shared_from_this()
              { // construct (do nothing)
              }

             enable_shared_from_this(const enable_shared_from_this& _Right)
              : _Wptr(_Right._Wptr)
              { // construct
              }

             enable_shared_from_this& operator=(const enable_shared_from_this& _Right)
              { // assign
              _Wptr = _Right._Wptr;
              return *this;
              }

             ~enable_shared_from_this()
              { // destroy (do nothing)
              }

            private:
             template<class _Ty1,
              class _Ty2>
              friend void _Do_enable(
               _Ty1 *,
               enable_shared_from_this<_Ty2>*,
               _Ref_count_base *);

             mutable weak_ptr<_Ty> _Wptr;
             };


            enable_shared_from_this 的member可是一個weak_ptr.

            當然,從enable_shared_from_this繼承后,遇到shared_ptr后,member _Wptr 是怎樣工作的,另有玄機。 可以設斷點在 _Do_enable 里,有助于理解。

            看似簡單的share_ptr, 被實現的看似危機四伏。

            posted on 2012-04-07 11:57 多彩人生 閱讀(425) 評論(0)  編輯 收藏 引用

            導航

            統計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            思思久久好好热精品国产| 久久精品国产半推半就| 人妻无码精品久久亚瑟影视| 久久无码专区国产精品发布| 亚洲乱码精品久久久久..| 久久婷婷五月综合色奶水99啪| 精品熟女少妇AV免费久久| 久久精品国产亚洲AV无码偷窥| 久久免费精品视频| 伊人久久大香线蕉综合网站| 久久人人爽人人爽人人片AV不 | 国产免费久久精品99re丫y| 久久人人爽人人爽人人片AV不 | 久久91精品国产91久久麻豆| 精品久久人人妻人人做精品| 久久久久亚洲av成人网人人软件| 国产精品久久久久无码av| 亚洲а∨天堂久久精品9966| 久久久老熟女一区二区三区| 午夜精品久久影院蜜桃| 久久久精品一区二区三区| 波多野结衣久久一区二区| 久久精品国产黑森林| 国产精品九九九久久九九| 香蕉久久久久久狠狠色| 精品熟女少妇aⅴ免费久久| 国产综合久久久久久鬼色| 久久精品中文字幕一区| 亚洲国产成人久久精品99 | 97视频久久久| 久久久久人妻精品一区三寸蜜桃 | 久久亚洲精品成人AV| 久久这里只有精品首页| 伊人久久大香线蕉精品不卡| 婷婷久久综合九色综合绿巨人| 国産精品久久久久久久| 九九久久精品无码专区| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 狠狠色综合久久久久尤物| 亚洲综合久久综合激情久久| 久久99久久99小草精品免视看|