<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>
  • 網站首頁 > 物聯資訊 > 技術分享

    智能指針(三):unique_ptr使用簡介

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

    我們知道auto_ptr通過復制構造或者通過=賦值后,原來的auto_ptr對象就報廢了.所有權轉移到新的對象中去了.而通過shared_ptr可以讓多個智能指針對象同時擁有某一塊內存的訪問權.但假如我們不希望多個內存塊被多個智能指針對象共享,同時又不會像auto_ptr那樣不知不覺的就讓原來的auto_ptr對象失效,可咋整呢?

    這個時候就要使用unique_ptr了,顧名思義嘛,unique是唯一的意思.說明它跟auto_ptr有點類似,就是同時只能有一個智能指針對象指向某塊內存.但它還有些其他特性.

    1.無法進行復制構造與賦值操作.

    比如auto_ptr<int> ap(new int(88 );

          auto_ptr<int> one (ap) ; // ok

          auto_ptr<int> two = one; //ok

    但unique_ptr不支持上述操作

      unique_ptr<int> ap(new int(88 );

      unique_ptr<int> one (ap) ; // 會出錯

      unique_ptr<int> two = one; //會出錯

     

    2.可以進行移動構造和移動賦值操作

    就是像上面這樣一般意義上的復制構造和賦值或出錯.但在函數中作為返回值卻可以用.

    unique_ptr<int> GetVal( ){

    unique_ptr<int> up(new int(88 );

    return up;

    }

     

    unique_ptr<int> uPtr = GetVal();   //ok

     

    實際上上面的的操作有點類似于如下操作

    unique_ptr<int> up(new int(88 );

    unique_ptr<int> uPtr2 = std:move( up) ; //這里是顯式的所有權轉移. 把up所指的內存轉給uPtr2了,而up不再擁有該內存.另外注意如果你使用vs2008是沒有std:move這函數的.

    //vs2010開始才有,是c++ 11標準出現的內容.

     

     

    3.可做為容器元素

    我們知道auto_ptr不可做為容器元素.而unique_ptr也同樣不能直接做為容器元素,但可以通過一點間接的手段

    例如:

    unique_ptr<int> sp(new int(88) );

    vector<unique_ptr<int> > vec;

    vec.push_back(std::move(sp));

    //vec.push_back( sp ); 這樣不行,會報錯的.

    //cout<<*sp<<endl;但這個也同樣出錯,說明sp添加到容器中之后,它自身報廢了.

     

    總結:

    從上面的例子可以看出,unique_ptr和auto_ptr真的非常類似.其實你可以這樣簡單的理解,auto_ptr是可以說你隨便賦值,但賦值完了之后原來的對象就不知不覺的報廢.搞得你莫名其妙.而unique就干脆不讓你可以隨便去復制,賦值.如果實在想傳個值就哪里,顯式的說明內存轉移std:move一下.然后這樣傳值完了之后,之前的對象也同樣報廢了.只不過整個move你讓明顯的知道這樣操作后會導致之前的unique_ptr對象失效.

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