<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                再看第二個例子,代碼如下所示: **例子2** ~~~ int main() { A *pA =new A(); wp<A> wpA(A); sp<A> spA = wpA.promote();//通過promote函數,得到一個sp。 } ~~~ 對A的wp化,不再做分析了。按照前面所學的知識,wp化后僅會使弱引用計數加1,所以此處wp化的結果是: - 影子對象的弱引用計數為1,強引用計數仍然是初始值0x1000000。 wpA的promote函數是從一個弱對象產生一個強對象的重要函數,試看: 1. 由弱生強的方法 代碼如下所示: **RefBase.h** ~~~ template<typename T> sp<T> wp<T>::promote() const { returnsp<T>(m_ptr, m_refs); //調用sp的構造函數。 } ~~~ **RefBase.h** ~~~ template<typename T> sp<T>::sp(T* p, weakref_type* refs) :m_ptr((p && refs->attemptIncStrong(this)) ? p : 0)//有點看不清楚 { //上面那行代碼夠簡潔,但是不方便閱讀,我們寫成下面這樣: /* T* pTemp= NULL; //關鍵函數attemptIncStrong if(p !=NULL && refs->attemptIncStrong(this) == true) pTemp = p; m_ptr =pTemp; */ } ~~~ 2. 成敗在此一舉 由弱生強的關鍵函數是attemptIncStrong,它的代碼如下所示: **RefBase.cpp** ~~~ boolRefBase::weakref_type::attemptIncStrong(const void* id) { incWeak(id);//增加弱引用計數,此時弱引用計數變為2 weakref_impl* const impl = static_cast<weakref_impl*>(this); int32_t curCount = impl->mStrong; //這個仍是初始值 //下面這個循環,在多線程操作同一個對象時可能會循環多次。這里可以不去管它, //它的目的就是使強引用計數增加1 while(curCount > 0 && curCount != INITIAL_STRONG_VALUE) { if(android_atomic_cmpxchg(curCount, curCount+1, &impl->mStrong) == 0) { break; } curCount = impl->mStrong; } if(curCount <= 0 || curCount == INITIAL_STRONG_VALUE) { bool allow; /* 下面這個allow的判斷極為精妙。impl的mBase對象就是實際對象,有可能已經被delete了。 curCount為0,表示強引用計數肯定經歷了INITIAL_STRONG_VALUE->1->...->0的過程。 mFlags就是根據標志來決定是否繼續進行||或&&后的判斷,因為這些判斷都使用了mBase, 如不做這些判斷,一旦mBase指向已經回收的地址,你就等著segment fault吧! 其實,咱們大可不必理會這些東西,因為它不影響我們的分析和理解。 */ if(curCount == INITIAL_STRONG_VALUE) { allow =(impl->mFlags&OBJECT_LIFETIME_WEAK) != OBJECT_LIFETIME_WEAK || impl->mBase->onIncStrongAttempted(FIRST_INC_STRONG, id); }else { allow = (impl->mFlags&OBJECT_LIFETIME_WEAK) ==OBJECT_LIFETIME_WEAK && impl->mBase->onIncStrongAttempted(FIRST_INC_STRONG,id); } if(!allow) { //allow為false,表示不允許由弱生強,弱引用計數要減去1,這是因為咱們進來時加過一次 decWeak(id); return false; //由弱生強失敗 } //允許由弱生強,則強引用計數要增加1,而弱引用計數已經增加過了 curCount = android_atomic_inc(&impl->mStrong); if(curCount > 0 && curCount < INITIAL_STRONG_VALUE) { impl->mBase->onLastStrongRef(id); } } impl->addWeakRef(id); impl->addStrongRef(id);//兩個函數調用沒有作用 if(curCount == INITIAL_STRONG_VALUE) { //強引用計數變為1 android_atomic_add(-INITIAL_STRONG_VALUE, &impl->mStrong); //調用onFirstRef,通知該對象第一次被強引用 impl->mBase->onFirstRef(); } returntrue; //由弱生強成功 } ~~~ 3. 第二板斧的結果 promote完成后,相當于增加了一個強引用。根據上面所學的知識可知: - 由弱生強成功后,強弱引用計數均增加1。所以現在影子對象的強引用計數為1,弱引用計數為2。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看