<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之旅 廣告
                我們在external目錄下建立一個C++應用程序weightpointer來說明強指針和弱指針的使用方法,它的目錄結構如下: ~~~ ~/Android ----external ----weightpointer ----weightpointer.cpp ----Android.mk ~~~ 應用程序weightpointer的實現很簡單,它只有一個源文件 weightpointer.cpp和一個編譯腳本文件Android.mk。下面我們就分別介紹它們的內容。 **weightpointer.cpp** ~~~ #include <stdio.h> #include <utils/RefBase.h> #define INITIAL_STRONG_VALUE (1<<28) using namespace android; class WeightClass : public RefBase { public: void printRefCount() { int32_t strong = getStrongCount(); weakref_type* ref = getWeakRefs(); printf("-----------------------\n"); printf("Strong Ref Count: %d.\n", (strong == INITIAL_STRONG_VALUE ? 0 : strong)); printf("Weak Ref Count: %d.\n", ref->getWeakCount()); printf("-----------------------\n"); } }; class StrongClass : public WeightClass { public: StrongClass() { printf("Construct StrongClass Object.\n"); } virtual ~StrongClass() { printf("Destory StrongClass Object.\n"); } }; class WeakClass : public WeightClass { public: WeakClass() { extendObjectLifetime(OBJECT_LIFETIME_WEAK); printf("Construct WeakClass Object.\n"); } virtual ~WeakClass() { printf("Destory WeakClass Object.\n"); } }; class ForeverClass : public WeightClass { public: ForeverClass() { extendObjectLifetime(OBJECT_LIFETIME_FOREVER); printf("Construct ForeverClass Object.\n"); } virtual ~ForeverClass() { printf("Destory ForeverClass Object.\n"); } }; void TestStrongClass(StrongClass* pStrongClass) { wp<StrongClass> wpOut = pStrongClass; pStrongClass->printRefCount(); { sp<StrongClass> spInner = pStrongClass; pStrongClass->printRefCount(); } sp<StrongClass> spOut = wpOut.promote(); printf("spOut: %p.\n", spOut.get()); } void TestWeakClass(WeakClass* pWeakClass) { wp<WeakClass> wpOut = pWeakClass; pWeakClass->printRefCount(); { sp<WeakClass> spInner = pWeakClass; pWeakClass->printRefCount(); } pWeakClass->printRefCount(); sp<WeakClass> spOut = wpOut.promote(); printf("spOut: %p.\n", spOut.get()); } void TestForeverClass(ForeverClass* pForeverClass) { wp<ForeverClass> wpOut = pForeverClass; pForeverClass->printRefCount(); { sp<ForeverClass> spInner = pForeverClass; pForeverClass->printRefCount(); } } int main(int argc, char** argv) { printf("Test Strong Class: \n"); StrongClass* pStrongClass = new StrongClass(); TestStrongClass(pStrongClass); printf("\nTest Weak Class: \n"); WeakClass* pWeakClass = new WeakClass(); TestWeakClass(pWeakClass); printf("\nTest Forever Class: \n"); ForeverClass* pForeverClass = new ForeverClass(); TestForeverClass(pForeverClass); pForeverClass->printRefCount(); delete pForeverClass; return 0; } ~~~ 文件首先定義了一個繼承了RefBase類的WeightClass類,它只有一個成員函數printRefCount,用來打印對象的引用計數,包括強引用計數和弱引用計數。 然后又定義了三個類StrongClass、WeakClass和ForeverClass,它們都繼承了WeightClass類。其中,StrongClass類對象的生命周期只受強引用計數影響,WeakClass類對象的生命周期同時受到強引用計數和弱引用計數的影響,ForeverClass類對象的生命周期完全不受強引用計數和弱引用計數的影響。 接著又定義了三個測試函數TestStrongClass、TestWeakClass和TestForeverClass,它們分別用來測試強指針和弱指針的三種使用情景,以驗證我們對強指針和弱指針的實現原理分析。在TestStrongClass函數中,第70行將一個StrongClass對象賦值給一個弱指針wpOut,因此,第71行打印出該StrongClass對象的強引用計數值和弱引用計數值應該分別為0和1。接下來第74行再將該StrongClass對象賦值給一個強指針spInner,因此,第75行打印出該StrongClass對象的強引用計數值和弱引用計數值應該分別為1和2。函數執行到第78行時,由于已經超出了強指針spInner的作用域,因此,此時該StrongClass對象的強引用計數值和弱引用計數值應該分別為0和1。由于該StrongClass對象的生命周期只受強引用計數的影響,因此,該StrongClass對象會自動被釋放,這一點可以通過觀察StrongClass類的析構函數中的日志輸出來確認。函數第78行試圖將弱指針wpOut升級為強指針,但是由于弱指針wpOut所引用的StrongClass對象已經被釋放,因此,弱指針wpOut升級為強指針就會失敗,即第79行獲得的強指針spOut所引用的對象地址就為0。當TestStrongClass函數返回時,由于超出了弱指針wpOut的作用域,因此,此時該StrongClass對象的弱引用計數值也會減少為0。 在TestWeakClass函數中,第84行將一個WeakClass對象賦值給一個弱指針wpOut,因此,第85行打印出該WeakClass對象的強引用計數值和弱引用計數值應該分別為0和1。接下來第88行再將該WeakClass對象賦值給一個強指針spInner,因此,第89行打印出該WeakClass對象的強引用計數值和弱引用計數值應該分別為1和2。函數執行到第92行時,由于已經超出了強指針spInner的作用域,因此,此時該WeakClass對象的強引用計數值和弱引用計數值應該為0和1。由于該WeakClass對象的生命周期同時受強引用計數和弱引用計數的影響,因此,此時該WeakClass對象不會被釋放。函數第93行試圖將弱指針wpOut升級為強指針,由于弱指針wpOut所引用的WeakClass對象還存在,因此,弱指針wpOut就能夠成功升級為強指針spOut,即第94行獲得的強指針spOut所引用的對象地址就不為0,并且此時該WeakClass對象的強引用計數值和弱引用計數值應該分別為1和2。當TestWeakClass函數返回時,由于超出了弱指針wpOut和強指針spOut的作用域,因此,此時該WeakClass對象的強引用計數值和弱引用計數值都應該減少為0,于是它就會被釋放,這一點可以通過觀察WeakClass類的析構函數中的日志輸出來確認。 在TestForeverClass函數中,第99行將一個ForeverClass對象賦值給一個弱指針wpOut,因此,第100行打印出該ForeverClass對象的強引用計數值和弱引用計數值應該分別為0和1。接下來第103行再將該ForeverClass對象賦值給一個強指針spInner,因此,第104行打印出該ForeverClass對象的強引用計數值和弱引用計數值應該分別為1和2。當TestForeverClass函數返回時,由于超出了弱指針wpOut和強指針spInner的作用域,因此,此時該ForeverClass對象的強引用計數值和弱引用計數值都應該減少為0。但是由于該ForeverClass對象的生命周期不受強引用計數和弱引用計數的影響,因此它不會被自動釋放,這一點可以通過觀察WeakClass類的析構函數有沒有日志輸出來確認。 最后,在應用程序weightpointer的入口函數main中,分別調用了上述三個測試函數來驗證強指針和弱指針的實現原理。由于第111行和第115行創建的對象都受到引用計數的影響,因此,它們會被自動釋放;而第119行創建的對象不受引用計數的影響,因此,我們需要在第122行中手動地釋放該對象。 **Android.mk** ~~~ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_MODULE := weightpointer LOCAL_SRC_FILES := weightpointer.cpp LOCAL_SHARED_LIBRARIES := \ libcutils \ libutils include $(BUILD_EXECUTABLE) ~~~ 這是應用程序weightpointer的編譯腳本文件,它引用了libcutils和libutils兩個庫。 上述兩個文件準備好之后,我們就可以對這個C++工程進行編譯和打包了。 ~~~ USER@MACHINE:~/Android$ mmm ./external/weightpointer/ USER@MACHINE:~/Android$ make snod ~~~ 編譯成功之后,就可以在out/target/product/gerneric/system/bin目錄下看到應用程序文件weightpointer了;打包成功之后,該應用程序就包含在out/target/product/gerneric目錄下的Android系統鏡像文件system.img中了。 最后,我們使用新得到的系統鏡像文件system.img來啟動Android模擬器。Android模擬器啟動起來之后,使用adb工具連接上它,并進入到/system/bin目錄中,運行應用程序weightpointer來查看它的輸出,從而驗證強指針和弱指針的實現原理。 ~~~ USER@MACHINE: ~/Android$ emulator & USER@MACHINE:~/Android$ adb shell root@android:/ # cd system/bin/ root@android:/system/bin # ./weightpointer Test Strong Class: Construct StrongClass Object. ----------------------- Strong Ref Count: 0. Weak Ref Count: 1. ----------------------- ----------------------- Strong Ref Count: 1. Weak Ref Count: 2. ----------------------- Destory StrongClass Object. spOut: 0x0. Test Weak Class: Construct WeakClass Object. ----------------------- Strong Ref Count: 0. Weak Ref Count: 1. ----------------------- ----------------------- Strong Ref Count: 1. Weak Ref Count: 2. ----------------------- ----------------------- Strong Ref Count: 0. Weak Ref Count: 1. ----------------------- spOut: 0xa528. Destory WeakClass Object. Test Forever Class: Construct ForeverClass Object. ----------------------- Strong Ref Count: 0. Weak Ref Count: 1. ----------------------- ----------------------- Strong Ref Count: 1. Weak Ref Count: 2. ----------------------- ----------------------- Strong Ref Count: 0. Weak Ref Count: 0. ----------------------- Destory ForeverClass Object. ~~~ 如果能看到上面的輸出,就說明我們前面對強指針和弱指針的實現原理的分析是正確的。
                  <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>

                              哎呀哎呀视频在线观看