幾種智慧型指標比較

2021-08-14 04:28:23 字數 2315 閱讀 8083

auto_ptr

因為auto_ptr並不是完美無缺的,它的確很方便,但也有缺陷,在使用時要注意避免。首先,不要將auto_ptr物件作為stl容器的元素。c++標準明確禁止這樣做,否則可能會碰到不可預見的結果

auto_ptr的另乙個缺陷是將陣列作為auto_ptr的引數: auto_ptrpstr (new char[12] ); //陣列;為定義

然後釋放資源的時候不知道到底是利用delete pstr,還是 delete pstr;

然後收集了關於auto_ptr的幾種注意事項:

1、auto_ptr不能共享所有權。

2、auto_ptr不能指向陣列

3、auto_ptr不能作為容器的成員。

4、不能通過賦值操作來初始化auto_ptr

std::auto_ptrp(new int(42)); //ok

std::auto_ptrp = new int(42); //error

這是因為auto_ptr 的建構函式被定義為了explicit

5、不要把auto_ptr放入容器

scoped_ptr

boost::scoped_ptr的實現和std::auto_ptr非常類似,都是利用了乙個棧上的物件去管理乙個堆上的物件,從而使得堆上的物件隨著棧上的物件銷毀時自動刪除。不同的是,boost::scoped_ptr有著更嚴格的使用限制——不能拷貝。這就意味著:boost::scoped_ptr指標是不能轉換其所有權的。

不能轉換所有權

boost::scoped_ptr所管理的物件生命週期僅僅侷限於乙個區間(該指標所在的"{}"之間),無法傳到區間之外,這就意味著boost::scoped_ptr物件是不能作為函式的返回值的(std::auto_ptr可以)。

不能共享所有權

這點和std::auto_ptr類似。這個特點一方面使得該指標簡單易用。另一方面也造成了功能的薄弱——不能用於stl的容器中。

不能用於管理陣列物件

由於boost::scoped_ptr是通過

delete來刪除所管理物件的,而陣列物件必須通過

deletep來刪除,因此boost::scoped_ptr是不能管理陣列物件的,如果要管理陣列物件需要使用boost::scoped_array類。

boost::scoped_ptr和std::auto_ptr的功能和操作都非常類似,如何在他們之間選取取決於是否需要轉移所管理的物件的所有權(如是否需要作為函式的返回值)。如果沒有這個需要的話,大可以使用boost::scoped_ptr,讓編譯器來進行更嚴格的檢查,來發現一些不正確的賦值操作。

shared_ptr

1. shared_ptr是boost庫所提供的乙個智慧型指標的實現,shared_ptr就是為了解決auto_ptr在物件所有權上的侷限性(auto_ptr是獨佔的),在使用引用計數的機制上提供了可以共享所有權的智慧型指標.

2. shared_ptr比auto_ptr更安全

3. shared_ptr是可以拷貝和賦值的,拷貝行為也是等價的,並且可以被比較,這意味這它可被放入標準庫的一般容器(vector,list)和關聯容器中(map)。

boost::shared_ptr的管理機制其實並不複雜,就是對所管理的物件進行了引用計數,當新增乙個boost::shared_ptr對該物件進行管理時,就將該物件的引用計數加一;減少乙個boost::shared_ptr對該物件進行管理時,就將該物件的引用計數減一,如果該物件的引用計數為0的時候,說明沒有任何指針對其管理,才呼叫delete釋放其所佔的記憶體。

參考:weak_ptr

乙個強引用當被引用的物件活著的話,這個引用也存在(就是說,當至少有乙個強引用,那麼這個物件就不能被釋放)。boost::share_ptr就是強引用。

相對而言,弱引用當引用的物件活著的時候不一定存在。僅僅是當它存在的時候的乙個引用。弱引用並不修改該物件的引用計數,這意味這弱引用它並不對物件的記憶體進行管理,在功能上類似於普通指標,然而乙個比較大的區別是,弱引用能檢測到所管理的物件是否已經被釋放,從而避免訪問非法記憶體

boost::weak_ptr是boost提供的乙個弱引用的智慧型指標,它的宣告可以簡化如下:

namespace boost ; }

可以看到,boost::weak_ptr必須從乙個boost::share_ptr或另乙個boost::weak_ptr轉換而來,這也說明,進行該物件的記憶體管理的是那個強引用的boost::share_ptr。boost::weak_ptr只是提供了對管理物件的乙個訪問手段。

boost::weak_ptr除了對所管理物件的基本訪問功能(通過get()函式)外,還有兩個常用的功能函式:expired()用於檢測所管理的物件是否已經釋放;lock()用於獲取所管理的物件的強引用指標。

參考:

智慧型指標 強弱智慧型指標

在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...

智慧型指標學習

最近接觸到智慧型指標很多,於是研究了一下智慧型指標的原理,寫下自己的心得體會,有不對的還請指正。智慧型指標產生的目的 因為在c 中,存在非常複雜的指標錯誤問題,例如,某個物件生成後,指向該物件的指標可能有多個,當我們用delete語句刪除其中的乙個指標後,物件就被銷毀,那麼其餘指向該物件的指標就會懸...

智慧型指標3

include include using namespace std define test smartptr class stub class sentry sentry private int lock template class refcountingtraits void unrefer...