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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                1. 延長生命的魔咒 RefBase為我們提供了一個這樣的函數: ~~~ extendObjectLifetime(int32_t mode) 另外還定義了一個枚舉: enum { OBJECT_LIFETIME_WEAK = 0x0001, OBJECT_LIFETIME_FOREVER = 0x0003 }; 注意:FOREVER的值是3,二進制表示是B11,而WEAK的二進制是B01,也就是說FOREVER包括了WEAK的情況。 ~~~ 上面這兩個枚舉值,是破除強弱引用計數作用的魔咒。先觀察flags為OBJECT_LIFETIME_WEAK的情況,見下面的例子。 **例子3** ~~~ class A:public RefBase { publicA() { extendObjectLifetime(OBJECT_LIFETIME_WEAK);//在構造函數中調用 } } int main() { A *pA =new A(); wp<A> wpA(A);//弱引用計數加1 { sp<A>spA(pA) //sp后,結果是強引用計數為1,弱引用計數為2 } .... } ~~~ sp的析構將直接調用RefBase的decStrong,它的代碼如下所示: **RefBase.cpp** ~~~ void RefBase::decStrong(const void* id) const { weakref_impl* const refs = mRefs; refs->removeStrongRef(id); constint32_t c = android_atomic_dec(&refs->mStrong); if (c== 1) { //上面原子操作后,強引用計數為0 const_cast<RefBase*>(this)->onLastStrongRef(id);、 //注意這句話。如果flags不是WEAK或FOREVER的話,將delete數據對象 //現在我們的flags是WEAK,所以不會delete 它 if((refs->mFlags&OBJECT_LIFETIME_WEAK) != OBJECT_LIFETIME_WEAK) { delete this; } } refs->removeWeakRef(id); refs->decWeak(id);//調用前弱引用計數是2。 } ~~~ 然后調用影子對象的decWeak。再來看它的處理,代碼如下所示: **RefBase.cpp::weakref_type的decWeak()函數** ~~~ void RefBase::weakref_type::decWeak(const void*id) { weakref_impl* const impl = static_cast<weakref_impl*>(this); impl->removeWeakRef(id); constint32_t c = android_atomic_dec(&impl->mWeak); if (c!= 1) return; //c為2,弱引用計數為1,直接返回。 /* 假設我們現在到了例子中的wp析構之處,這時也會調用decWeak,調用上邊的原子減操作后 c=1,弱引用計數變為0,此時會繼續往下運行。由于mFlags為WEAK ,所以不滿足if的條件 */ if((impl->mFlags&OBJECT_LIFETIME_WEAK) != OBJECT_LIFETIME_WEAK) { if(impl->mStrong == INITIAL_STRONG_VALUE) delete impl->mBase; else { delete impl; } } else{//flag為WEAK,滿足else分支的條件 impl->mBase->onLastWeakRef(id); /* 由于flags值滿足下面這個條件,所以實際對象會被delete,根據前面的分析, 實際對象的delete會檢查影子對象的弱引用計數,如果它為0,則會把影子對象也delete掉。 由于影子對象的弱引用計數此時已經為0,所以影子對象也會被delete。 */ if((impl->mFlags&OBJECT_LIFETIME_FOREVER) != OBJECT_LIFETIME_FOREVER) { delete impl->mBase; } } } ~~~ 2. LIFETIME_WEAK的魔力 看完上面的例子,我們發現什么了? - 在LIFETIME_WEAK的魔法下,強引用計數為0,而弱引用計數不為0的時候,實際對象沒有被delete!只有當強引用計數和弱引用計數同時為0時,實際對象和影子對象才會被delete。 3. 魔咒大揭秘 至于LIFETIME_FOREVER的破解,就不用再來一斧子了,我直接的答案是: - flags為0,強引用計數控制實際對象的生命周期,弱引用計數控制影子對象的生命周期。強引用計數為0后,實際對象被delete。所以對于這種情況,應記住的是,使用wp時要由弱生強,以免收到segment fault信號。 - flags為LIFETIME_WEAK,強引用計數為0,弱引用計數不為0時,實際對象不會被delete。當弱引用計數減為0時,實際對象和影子對象會同時被delete。這是功德圓滿的情況。 - flags為LIFETIME_FOREVER,對象將長生不老,徹底擺脫強弱引用計數的控制。所以你要在適當的時候殺死這些老妖精,免得她禍害“人間”。
                  <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>

                              哎呀哎呀视频在线观看