<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之旅 廣告
                # weak_ptr 弱指針(weak pointer)經常被解釋為用來打破使用shared_ptr管理的數據結構中循環(?)。但是我認為,將weak_ptr看成是指向具有下列特征的對象的指針更好一些。 * 只有當對象存在的時候,你才需要對其進行訪問 * 并且它可能被其他人刪除釋放 * 并且在最后一次使用之后調用其析構函數(通常用于釋放那些不具名的內存(anon-memory)資源 (譯注:weak_ptr可以保存一個“弱引用”,指向一個已經用shared_ptr進行管理的對象。為了訪問這個對象,一個weak_ptr可以通過shared_ptr的構造函數或者是weak_ptr的成員函數lock()轉化為一個shared_ptr。當最后一個指向這個對象的shared_ptr退出其生命周期并且這個對象被釋放之后,將無法從指向這個對象的weak_ptr獲得一個shared_ptr指針,shared_ptr的構造函數會拋出異常,而weak_ptr::lock也會返回一個空指針。) 我們來考慮一下如何實現一個老式的“星盤棋”( asteroid game)游戲,所有星星(asteroid)都屬于游戲(the game),但是所有星星都必須與它周圍的 星星保持聯系,并且與之保持相反的狀態。要維持一個相反的狀態,通常會消去一個或者多個星星,也就是會調用其析構函數。每個星星必須有一個列表來保存記錄它周圍的星星。這里需要注意的是,在這樣一個相鄰星星列表中的星星不應該是具有完整生命的(?),所以shared_ptr在這種情況下并不適合。另外一方面,當另外一個星星正看著某個星星時,(例如,依賴于這個星星計算其相反狀態),這個星星就不能被析構。 當然,星星的析構函數必須被調用以釋放其占用的資源(比如與圖形系統的連接)。我們所需要的是一個在任何時間都應該保持完整無缺,并且隨時都可以從中獲取一個星星的星星列表(?)。weak_ptr可以幫我們做到這一切: ``` void owner() { // … vector<shared_ptr<Asteroid>> va(100); for (int i=0; i<va.size(); ++i) { // 訪問相鄰的星星,計算相反狀態 va[i].reset(new Asteroid(weak_ptr(va[neighbor])); launch(i); } // … } ``` reset() 可以讓一個shared_ptr指向另外一個新的對象。 當然,我對ower類作了相當大的簡化,并且只給了每個星星一個鄰居。這里的關鍵是,我們使用了weak_ptr指向其鄰居星星。在計算相反狀態的時候,ower類則使用shared_ptr來代表星星與owner之間的所屬關系(?)。一個星星的相反關系的計算應該是這樣的: ``` void collision(weak_ptr<Asteroid> p) { // p.lock返回一個指向p所指對象的shared_ptr if (auto q = p.lock()) { // … p以及q指向的星星對象依然存在:進行計算… } else { // … oops: 星星對象已經被析構,我們可以忘掉它了(?)… } } ``` 注意,即使owner決定關閉整個游戲并釋放所有的星星對象(通過刪除代表所屬關系的多個shared_ptr),每一個正在計算過程中的星星對象仍然可以正確地結束,因為p.lock()將維持一個shared_ptr,直到計算過程結束。(譯注,也即是說,如果正在計算過程中關閉游戲并通過shared_ptr釋放對象,那么p.lock()會維持一個shared_ptr,這樣可以使得shared_ptr不會變成0,在計算過程中,星星對象也就不會被錯誤地釋放。當整個計算過程結束后,shared_ptr的引用計數變為0,星星對象被正確釋放。) 我期望看到weak_ptr比簡單的shared_ptr更少地被用到,并且我希望unique_ptr可以比shared_ptr更加流行,因為unique_ptr的所屬關系更簡單一些(譯注:只能有一個 unique_ptr指針指向某個對象,不向shared_ptr,可以同時有多個shared_ptr指向同一個對象)并且性能更高,因而可以讓局部的代碼更容易理解。 參考 * the C++ draft: Weak_ptr (20.7.13.3)
                  <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>

                              哎呀哎呀视频在线观看