<kbd id="daqct"></kbd>

  • <nav id="daqct"></nav>
    <wbr id="daqct"><pre id="daqct"></pre></wbr>
    <wbr id="daqct"></wbr>
    <form id="daqct"><th id="daqct"></th></form>
    更多課程 選擇中心

    C/C++培訓
    達內IT學院

    400-111-8989

    C++智能指針的基本用法

    • 發布: 上善若水
    • 來源: 碼農有道
    • 時間:2017-09-08 14:55

    本文閱讀目錄

    1、智能指針設計思想

    2、智能指針簡單使用

    3、為什么不建議使用auto_ptr

    4、如何選擇使用哪種智能指針

    智能指針設計思想

    在前面C/C++指針使用常見的坑一文中總結了C/C++中使用指針時可能會遇到的各種坑,其中最常見的是內存泄露,大家還記得下面這個例子吧。

    在這個例子中,由于拋出異常,delete語句沒有機會執行,造成內存泄露。當然對于這個幾十行規模的程序來說,你可以在catch語句中再加一句delete t可以避免。

    但是如果是一個幾十W行的工程項目了?我想你一定會崩潰吧!那么有沒有更好的辦法呢?答案是肯定的。

    我們知道,對于普通的局部變量(非靜態局部變量),當離開它的作用域時,操作系統會自動將其釋放的;并且我們也知道對于類對象在釋放的時候是會自動調用該類的析構函數。

    于是我們就想:如果是Test *t不是一個普通的指針變量,而是一個類對象的話,并且在類的析構函數中實現了釋放動態內存的步驟;那么只要該指針變量一退出作用域時就會調用析構函數,達到了釋放動態內存的目的。這就是智能指針的思想。

    根據前面的設想,自己也不難實現一個簡易的智能指針,如下:

    class SmartPointer { private:

    Test* ptr; public:

    SmartPointer(Test* p) {

    ptr = p;

    }

    ~SmartPointer() //析構函數釋放資源 {

    delete p;

    }};

    那么如何使用了,只需要在原來代碼的基礎上改動一點點即可,如下:

    C++智能指針簡單使用

    當然,前面我們自己實現的智能指針只是為了說明智能指針設計的思想,是非常簡陋的。在平時使用中是不會需要自己去定義智能指針的,C++已經給我們提供了現成的智能指針可以使用。

    C++ STL為我們提供了四種智能指針:auto_ptr、unique_ptr、shared_ptr和weak_ptr;其中auto_ptr是C++98提供,在C++11中建議摒棄不用,至于原因,后面會講到;而unique_ptr、shared_ptr和weak_ptr則是隨著C++11的到來而加入到STL中。

    智能指針的使用其實并不難,如下所示:

    為什么不建議使用auto_ptr

    先來看看下面的語句:

    auto_ptr<int> px(new int(8));auto_ptr<int> py;py = px;

    上述賦值語句將完成什么工作呢?如果px和py是普通指針,則兩個指針將指向同一個動態分配的int對象。這是不能接受的,因為程序可能將試圖刪除同一個對象兩次——一次是px過期時,另一次是py過期時,我們知道,同一塊內存是不能delete兩次的。要避免這種問題,主要有以下兩種方法:

    建立所有權(ownership)概念。對于特定的對象,同一時刻只能有一個智能指針可擁有, 比如說當智能指針A指向對象x,當執行完B=A后,原來的指針A就失去了對x的所有權,這樣只有擁有對象的智能指針的構造函數會刪除該對象,unique_ptr和auto_ptr就是采用這種策略。

    創建智能更高的指針,跟蹤引用特定對象的智能指針數。這稱為引用計數。例如,賦值時,計數將加1,而指針過期時,計數將減1,。當減為0時才調用delete。這是shared_ptr采用的策略。

    當然,對于復制構造函數也應該采用同樣的策略。

    下面來看看在C++11中為什么建議摒棄auto_ptr,看下面的例子,

    從程序的運行結果來看,當執行完賦值語句py = px后,再去訪問px時程序崩潰了。原因就是因為賦值語句py = px使得對象的所有權從px轉讓給py了,px已經變為空指針了,再去訪問px當然會出錯了。

    那么如果使用unique_ptr或者shared_ptr又會怎樣了?還是測試下吧,先看unique_ptr情況:

    看看,如果使用unique_ptr,在這種情況下編譯會出錯,也就是說盡管與auto_ptr一樣,unique_ptr也采用所有權模型,但在使用unique_ptr時,程序不會等到運行階段崩潰,在編譯時就將可能潛在的錯誤暴露給你

    好了,再看看shared_ptr情況:

    使用shared_ptr時運行正常,因為shared_ptr采用引用計數,當執行完賦值語句py = px后,px和py都指向同一塊內存,只不過在釋放空間時因為事先要判斷引用計數值的大小因此不會出現多次刪除一個對象的錯誤。

    如何選擇哪種智能指針

    在了解了這幾種智能指針后,大家可能很自然的想到一個問題:在實際項目應用中,應使用哪種智能指針呢?根據這幾種智能指針的特點,給出下面幾點建議:

    如果程序中要使用多個指向同一個對象的指針,那么應該使用shared_ptr;比如說現在有一個包含指針的STL容器,現在用某個支持復制和賦值操作STL算法去操作該容器的指針元素,那么就應該用shared_ptr。不能用unique_ptr(編譯器報錯)和auto_ptr(行為不確定)。

    如果程序中不需要使用多個指向同一個對象的指針,則可使用unique_ptr;如果函數使用new分配內存,并返回指向該內存的指針,將其返回類型聲明為unique_ptr是不錯的選擇。這樣,所有權轉讓給接受返回值的unique_ptr,而該智能指針將負責調用delete。

    在滿足unique_ptr要求的條件時,也可使用auto_ptr,但unique_ptr是更好的選擇。

    總結

    這篇文章只是從大體上總結了智能指針的基本用法,而在實際使用中還有許多值得注意的地方,后面會有文章繼續總結這些細節,總之,學習C++的過程就是一個踩坑的過程。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:電子書推薦:編寫高質量代碼:改善C程序代碼的125個建議
    下一篇:C/C++指針知識點深度剖析

    C語言創建windows窗口實例

    C++回調函數是什么?

    C++ shared_ptr和動態數組

    C語言有哪些關鍵詞,C語言44個關鍵詞大全

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美三级片,白洁外传,第四色播日韩AV第一页,啪啪免费观看大全av 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>