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

來源:互聯網
上載者:User
文章目錄
  • 1.無法進行複製構造與賦值操作.
  •  
  • 2.可以進行移動構造和移動賦值操作
  •  
  • 3.可做為容器元素
  • 總結:

我們知道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對象失效.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.