智慧型指標 三 unique ptr使用簡介

2021-06-22 03:58:16 字數 1366 閱讀 2413

我們知道auto_ptr通過複製構造或者通過=賦值後,原來的auto_ptr物件就報廢了.所有權轉移到新的物件中去了.而通過shared_ptr可以讓多個智慧型指標物件同時擁有某一塊記憶體的訪問權.但假如我們不希望多個記憶體塊被多個智慧型指標物件共享,同時又不會像auto_ptr那樣不知不覺的就讓原來的auto_ptr物件失效,可咋整呢?

這個時候就要使用unique_ptr了,顧名思義嘛,unique是唯一的意思.說明它跟auto_ptr有點類似,就是同時只能有乙個智慧型指標物件指向某塊記憶體.但它還有些其他特性.

比如auto_ptrap(new int(88 );

auto_ptrone (ap) ; // ok

auto_ptrtwo = one; //ok

但unique_ptr不支援上述操作

unique_ptrap(new int(88 );

unique_ptrone (ap) ; // 會出錯

unique_ptrtwo = one; //會出錯

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

unique_ptrgetval( ){

unique_ptrup(new int(88 );

return up;

unique_ptruptr = getval();   //ok

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

unique_ptrup(new int(88 );

unique_ptruptr2 = std:move( up) ; //這裡是顯式的所有權轉移. 把up所指的記憶體轉給uptr2了,而up不再擁有該記憶體.另外注意如果你使用vs2008是沒有std:move這函式的.

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

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

例如:unique_ptrsp(new int(88) );

vector> vec;

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

sp ); 這樣不行,會報錯的.

//cout<<*sp《從上面的例子可以看出,unique_ptr和auto_ptr真的非常類似.其實你可以這樣簡單的理解,auto_ptr是可以說你隨便賦值,但賦值完了之後原來的物件就不知不覺的報廢.搞得你莫名其妙.而unique就乾脆不讓你可以隨便去複製,賦值.如果實在想傳個值就**,顯式的說明記憶體轉移std:move一下.然後這樣傳值完了之後,之前的物件也同樣報廢了.只不過整個move你讓明顯的知道這樣操作後會導致之前的unique_ptr物件失效.

智慧型指標 unique ptr

unique ptr 是 c 11 提供的用於防止記憶體洩漏的智慧型指標中的一種實現,獨享被管理物件指標所有權的智慧型指標。int main std move是將物件的狀態或者所有權從乙個物件轉移到另乙個物件,只是轉移,沒有記憶體的搬遷或者記憶體拷貝所以可以提高利用效率,改善效能.get函式會返回儲...

智慧型指標 三 unique ptr使用簡介

我們知道auto ptr通過複製構造或者通過 賦值後,原來的auto ptr物件就報廢了.所有權轉移到新的物件中去了.而通過shared ptr可以讓多個智慧型指標物件同時擁有某一塊記憶體的訪問權.但假如我們不希望多個記憶體塊被多個智慧型指標物件共享,同時又不會像auto ptr那樣不知不覺的就讓原...

智慧型指標 三 unique ptr使用簡介

我們知道auto ptr通過複製構造或者通過 賦值後,原來的auto ptr物件就報廢了.所有權轉移到新的物件中去了.而通過shared ptr可以讓多個智慧型指標物件同時擁有某一塊記憶體的訪問權.但假如我們不希望多個記憶體塊被多個智慧型指標物件共享,同時又不會像auto ptr那樣不知不覺的就讓原...