1. 程式人生 > >C++11引入智慧指標std::unique_ptr

C++11引入智慧指標std::unique_ptr

包含標頭檔案<memery>

名稱空間:std/* 不是std::tr1 */

我們知道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物件失效.

相關推薦

C++11引入智慧指標std::unique_ptr

包含標頭檔案<memery> 名稱空間:std/* 不是std::tr1 */ 我們知道auto_ptr通過複製構造或者通過=賦值後,原來的auto_ptr物件就報廢了.所有權轉移到新的物件中去了.而通過shared_ptr可以讓多個智慧指標物件同時擁有

c++11智慧指標 shared_ptr & unique_ptr

一、背景 1. 堆記憶體、棧記憶體、靜態區記憶體 我們知道,靜態記憶體用來儲存區域性 static 物件、類 static 資料成員以及定義在函式之外的變數。而棧記憶體用來儲存定義在函式內的非 static 物件。 分配在靜態區或棧記憶體中的物件由編譯器自動建立和銷燬,對於棧

c++ 之四大智慧指標 std::auto_ptr std::shared_ptr std::unuque std::weak_ptr 比較總結

1. 動態記憶體必要性 程式不知道自己需要多少物件;  程式不知道物件的準確型別;  程式需要在多個物件之間共享資料; 2. 動態記憶體在哪裡 程式有靜態記憶體、棧記憶體。靜態記憶體用來儲存區域性static物件、類static資料成員以及定義在任何函式之外的變數

C++11智慧指標的使用

1.C++11中新增了三種智慧指標,在初始化指標後,如果類被析構,那指標所指向的物件會被自動析構,方便了程式設計師對指標的控制。 share_ptr:共享的智慧指標 weak_ptr:配合share_ptr使用的弱指標 unique_ptr:獨佔的智慧指標 2.智

C++11 智慧指標std::shared_ptr/std::unique_ptr/std::weak_ptr

std::shared_ptr std::shared_ptr 是一種智慧指標,它能夠記錄多少個 shared_ptr 共同指向一個物件,從而消除顯示的呼叫 delete,當引用計數變為零的時候就

C++之智慧指標std::shared_ptr簡單使用和理解

1  智慧指標std::shared_ptr相關知識和如何使用 我們這裡先說下智慧指標std::shared_ptr,因為我看到我我們專案c++程式碼裡面用得很多,我不是不會,所以記錄學習下 先讓ubuntu終端支援c++11,如果自己的電腦還沒配置號,可以先看下我的這篇部落格

C++智慧指標unique_ptr

從C++智慧指標之auto_ptr一文中得知:在使用auto_ptr時,可能會不經意的將多個auto_ptr指向同一塊記憶體,造成auto_ptr銷燬釋放時多次釋放同一塊記憶體。為了解決該問題,本文引出了unique_ptr。 顧名思義,unique是唯一的意思。說明它跟auto_p

實戰c++中的智慧指標unique_ptr系列-- 使用unique_ptr來避免if多層巢狀

今天看到這個文章,覺得沒有很nice。 我們太喜歡流程控制了,在程式中寫了太多的if else 也許我們對於邏輯非常的清晰,但是對於閱讀你程式碼的人來說就是一場災難。 很多人都說使用多型來避免過多的if else巢狀,但是有時候你會覺得新寫一個類似乎有

實戰c++中的智慧指標unique_ptr系列-- unique_ptr與lambda的錯誤結合(尤其是捕獲lambda中的unique_ptr)

lambda表示式是C++11新引入的東西,給我們帶來了很多的方便,使得程式碼簡潔明瞭。 但是當我們把unique_ptr和lambda表示式結合的時候,錯誤就往往會出現,而且是致命的。 直接看看下面的程式碼: #include "stdafx.h" #i

Cocos2dx 3.0 過渡篇(二十七)C++11多線程std::thread的簡單使用(下)

fonts fun avi 2dx read 來源 cpp break 輸出 本篇接上篇繼續講:上篇傳送門:http://blog.csdn.net/star530/article/details/24186783簡單的東西我都說的幾乎相同了,想挖點深的差點把自己給填進

c++11 智能指針 unique_ptr、shared_ptr與weak_ptr

del 最終 err fin 導致 cto 允許 定義 ptr c++11 智能指針 unique_ptr、shared_ptr與weak_ptr C++11中有unique_ptr、shared_ptr與weak_ptr等智能指針(smart pointer),定義在

C++11新特性之 std::forward(完美轉發)(轉)

tails array sin .com std utili res details calling 我們也要時刻清醒,有時候右值會轉為左值,左值會轉為右值。 (也許“轉換”二字用的不是很準確) 如果我們要避免這種轉換呢? 我們需要一種方法能按照參數原來的類型轉發到另一個函

C++ 自己實現智慧指標(輕量級)

文章目錄 引入 c++中間類 改進-增加引用計數 再次改進--使用模板template 再次改進--引用計數增加原子操作 引入 c++的堆和棧 class Person{ public:

C++11多執行緒------std::async

std::async可以認為是封裝了一個std::promise,該函式返回一個std::future,用於獲取其他執行緒的資料。 一般有兩種模式: std::lanch::async:最常用的非同步模式,每次都要執行一遍 std::lanch::defer:只在第

C++11引入nullprt

1. 引入nullptr的原因 引入nullptr的原因,這個要從NULL說起。對於C和C++程式設計師來說,一定不會對NULL感到陌生。但是C和C++中的NULL卻不等價。NULL表示指標不指向任何物件,但是問題在於,NULL不是關鍵字,而只是一個巨集定義(macro)。 1.1 NULL在C中的

C++11 併發指南三(std::mutex 詳解)

上一篇《C++11 併發指南二(std::thread 詳解)》中主要講到了 std::thread 的一些用法,並給出了兩個小例子,本文將介紹 std::mutex 的用法。 Mutex 又稱互斥量,C++ 11中與 Mutex 相關的類(包括鎖型別)和函式都宣告在 <mutex> 標頭檔案中

C++11 併發指南五(std::condition_variable 詳解)

前面三講《C++11 併發指南二(std::thread 詳解)》,《C++11 併發指南三(std::mutex 詳解)》分別介紹了 std::thread,std::mutex,std::future 等相關內容,相信讀者對 C++11 中的多執行緒程式設計有了一個最基本的認識,本文將介紹 C++11 標

C++11 併發指南二(std::thread 詳解)

上一篇部落格《C++11 併發指南一(C++11 多執行緒初探)》中只是提到了 std::thread 的基本用法,並給出了一個最簡單的例子,本文將稍微詳細地介紹 std::thread 的用法。 std::thread 在 <thread> 標頭檔案中宣告,因此使用 std::thread 時

C++11學習筆記:std::move和std::forward原始碼分析

std::move和std::forward是C++0x中新增的標準庫函式,分別用於實現移動語義和完美轉發。下面讓我們分析一下這兩個函式在gcc4.6中的具體實現。 預備知識 引用摺疊規則: X& + & => X& X&& +

“虎牙直播”實習生面試 c++中的智慧指標

剛剛接到了“虎牙直播”實習生的電話面試,說實在我都忘了當初什麼時候投的的了,是C++方向的。下面說一說電話面試的過程。 本來中午一個珠海的有人給我打電話,我沒接到。後來中午我吃飯時看到資訊後,回了條簡訊,約定下午四點電話面試。四點鐘電話準時接通,開始面試: 下面我就直接說下