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

             為什么會(huì)有 tr1::enable_shared_from_this 這個(gè)類(lèi),一直不解,直到看了Stephan T. Lavavej給出的關(guān)于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 就對(duì)了:

            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 的實(shí)現(xiàn)://也可看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可是一個(gè)weak_ptr.

            當(dāng)然,從enable_shared_from_this繼承后,遇到shared_ptr后,member _Wptr 是怎樣工作的,另有玄機(jī)。 可以設(shè)斷點(diǎn)在 _Do_enable 里,有助于理解。

            看似簡(jiǎn)單的share_ptr, 被實(shí)現(xiàn)的看似危機(jī)四伏。

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


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(3)

            隨筆分類(lèi)

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            曰曰摸天天摸人人看久久久| 久久夜色精品国产亚洲| 亚洲精品美女久久777777| 久久丫精品国产亚洲av不卡| 久久天堂AV综合合色蜜桃网| 狠狠色婷婷久久一区二区三区| 精品国产VA久久久久久久冰| 久久久久久国产精品美女| 久久精品国产日本波多野结衣 | 青青草原综合久久大伊人精品| 久久99热狠狠色精品一区| 亚洲国产成人久久综合碰| 久久久久久久久无码精品亚洲日韩| 成人精品一区二区久久| 77777亚洲午夜久久多人| 91久久精品视频| 99久久精品费精品国产一区二区| 亚洲国产成人久久综合野外| 亚洲国产精品久久久久婷婷老年| 久久精品青青草原伊人| 精品综合久久久久久88小说 | 国产精品久久久久久久久久影院 | 国产一区二区精品久久岳| 久久久久久国产精品免费无码 | 欧洲人妻丰满av无码久久不卡| 国产亚洲精午夜久久久久久| 国产精品久久一区二区三区 | 潮喷大喷水系列无码久久精品| 中文字幕无码久久人妻| 久久久久国产一区二区| 99久久国产综合精品五月天喷水 | 精品999久久久久久中文字幕| 天天爽天天狠久久久综合麻豆| 久久久久99这里有精品10 | 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久ZYZ资源站无码中文动漫| 久久婷婷国产剧情内射白浆| 亚洲人成网站999久久久综合| 久久精品免费大片国产大片| 国产精品激情综合久久| 精品久久久久久久久久久久久久久|