智慧型指標區別與使用

2021-08-20 21:18:19 字數 1999 閱讀 3209

智慧型指標(類模板):

智慧型指標生存的意義就是為粗心的程式設計師以及不合理的程式,例如異常情況跳出了某乙個空間的

釋放**段沒有執行釋放記憶體的**。而使用智慧型指標則為了讓指標自動處理以上問題保證記憶體

不易洩露。

*****不帶應用計數

***********auto_ptr(c++)#include*************

*這個事基本的智慧型指標,它把指標封裝成了乙個類物件。利用系統對棧上物件自動析構的特點,在

出了作用域後自動析構這個指標,防止記憶體洩露。

*注意這個指標的建構函式做了explicit宣告,所以我們不能auto_ptra=new int;必須要用

auto_ptra(new int);

*當所有權轉讓,原來的物件將會析構。這就保證乙個資源只有乙個auto_ptr與之對應,不能用於容器當中。

因為如果這樣做我vector(10).我在做拷貝構造或者給新的vec賦值原來容器裡面物件就沒有了,

這顯然不符合我們stl的要求。

*********scoped_ptr(boost)********************

與auto_ptr的區別

不能轉換所有權

boost::scoped_ptr所管理的物件生命週期僅僅侷限於乙個區間(該指標所在的"{}"之間),無法

傳到區間之外,這就意味著boost::scoped_ptr物件是不能作為函式的返回值的(std::auto_ptr可以)。

其他和我們的auto_ptr類似。

由於boost::scoped_ptr是通過delete來刪除所管理物件的,而陣列物件必須通過deletep來刪除,因此boost::scoped_ptr

是不能管理陣列物件的,如果要管理陣列物件需要使用boost::scoped_array類。

*********unique_ptr(boost)*******************888

unique_ptrap(new int(88 );

unique_ptrone (ap) ; // 會出錯

unique_ptrtwo = one;//會出錯

unique_ptr沒有這兩個函式,如果想經行如上操作可按如下兩種方法:

1.unique_ptrgetval( )

unique_ptruptr =getval();   //ok 2.

unique_ptrup(new int(88 );

unique_ptruptr2 = std:move(up) ; 

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

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

*區別:

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

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

vector> vec;

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

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

所以這樣不帶引用計數的盡量不要和容器沾邊。

它在scope_ptr上加入了std:move()功能,其他跟scope_ptr類似。

*****帶引用計數:

*******************shared_ptr

底層維護了乙個引用計數,當引用計數為0的時候,我們才真正的析構這塊物件

*******************weak_ptr

**為了解決shared指標的交叉引用問題。

weak指標不增加shared的引用計數,但是weak的lock可以返回指weak空間的lock,如果這個空間被釋放了

則會返回null。

強指標可以給弱指標賦值

**shared_ptr在多個執行緒同時拿到share_ptr時候,讀操作安全寫操作不安全,盡量不要在多執行緒中,需要寫

操作使用share_ptr.

智慧型指標使用摘要

1.如果沒有拷貝 賦值等要求,優先選用scoped ptr 2.如果不需要放入容器中 放入容器中的元素型別必須是能拷貝的 優先選用scoped ptr 3.如果不需要自定義刪除器,優先選用scoped ptr 4.盡量不要用scoped array管理new出來的陣列,改用vector代替 5.只能...

C 智慧型指標使用

由於 c 語言沒有自動記憶體 機制,程式設計師每次 new 出來的記憶體都要手動 delete。程式設計師忘記 delete,流程太複雜,最終導致沒有 delete,異常導致程式過早退出,沒有執行 delete 的情況並不罕見。std auto ptr boost scoped ptr boost ...

boost 智慧型指標使用

1 scoped ptr 基本功能類似auto ptr。首先確保任何時候物件都能被正確的刪除。且 scoped ptr所有權不能轉讓,一旦獲取,無法從它那裡取回。scoped ptr 不能作為容器的元素,不允許不支援拷貝和賦值,因為拷貝和賦值函式是私有的。即,不存在 sp1 sp2 這樣的操作。sc...