<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    智能指針(二):shared_ptr實現原理

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    前面講到auto_ptr有個很大的缺陷就是所有權的轉移,就是一個對象的內存塊只能被一個智能指針對象所擁有.但我們有些時候希望共用那個內存塊.于是C++ 11標準中有了shared_ptr這樣的智能指針,顧名思義,有個shared表明共享嘛.所以shared_ptr類型的智能指針可以做為STL容器的元素

     

    下面我們來瞧瞧shared_ptr具體是咋實現的.相較auto_ptr有下面幾個不同的地方:

    1.引進了一個計數器shared_count,用來表示當前有多少個智能指針對象共享指針指向的內存塊

    2.析構函數中不是直接釋放指針對應的內存塊,如果shared_count大于1則不釋放內存只是將引用計數減1,只是計數等于1時釋放內存

    3.復制構造與賦值操作符只是提供一般意義上的復制功能,并且將引用計數加1.

     

    shared_ptr實現代碼(只實現核心功能)

    #include <iostream>

    using namespace std;

    template<class T>

    class shared_ptr{

    private:

    T* m_ptr; //被封裝的指針

    unsigned int shared_count;   //引用計數,表示有多少個智能指針對象擁有m_ptr指向的內存塊

    public:

    shared_ptr(T* p):m_ptr(p),shared_count(1){ }

    ~shared_ptr() { deconstruct();}

    void deconstruct(){

    if(shared_count == 1)   //引用計數為1表示只有一個對象使用指針指向的內存塊了

    {

    delete m_ptr;

    m_ptr = 0;

    }

    shared_count--;

    }

    T& operator*() { return *m_ptr;}

    T* operator->() { return m_ptr;}

     

    //復制構造函數

    shared_ptr(shared_ptr& sp):m_ptr(sp.m_ptr),shared_count(sp.shared_count){

    shared_count++;

    }

    //重載運算符=

    shared_ptr& operator = (shared_ptr& sp){

    sp.shared_count++;   

    deconstruct();  //相當于先刪掉左值,然后再通過右值賦值.

    m_ptr = sp.m_ptr;

    shared_count = sp.shared_count;

    return *this;

    } 

    };

     

    使用舉例:

    如有類struct Arwen{

    int age;

    Arwen(int gg) :age(gg) { };

    };

     

    //下面代碼全部運行正確

    void main(){

    shared_ptr<Arwen> myPtr( new Arwen(24) );

    int num =myPtr->age;

     

    shared_ptr<Arwen> ptrOne( myPtr); //復制構造

    num =myPtr->age; //如果是auto_ptr該處會出錯.因為把myPtr復制給ptrOne后,它自己本身相當于失效了

    num = ptrOne->age;

     

    shared_ptr<Arwen> ptrTwo = ptrOne;

    num = ptrOne->age;//如果是auto_ptr該處也會出錯,此時ptrOne也失效了

    num = ptrTwo->age;

     

    return 0;

    }

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全