c shared ptr智慧型指標使用注意事項

2021-06-20 04:57:09 字數 1562 閱讀 4561

shared_ptr在boost中地位相當重要,其行為最接近原始指標,但又比指標更加安全,甚至還能提供基本的執行緒安全保證。它基本上解決了在使用c++開發過程中不可避免的使用指標而遇到的許多問題,常見的毫無疑問是記憶體洩漏和記憶體的提前釋放,還有一些關於指標記憶體申請而產生的異常問題等。而要想較好的使用shared_ptr來完全取代指標絕非易事。下面簡要說說使用shared_ptr需要注意的問題。

1、share_ptr是乙個類,它產生的是乙個類物件,而不是乙個原生的指標物件,但是為了減少類物件與針對物件使用的差異性,所以share_ptr類故意過載了兩種常見的指標操作符: *和->。從而share_ptr與普通指標使用方式一樣。簡言之,就是share_ptr生成的乙個包含型別指標容器物件,它封裝了指標物件,對指標物件負全責,包括生成、釋放等;

2、特別需要注意的是,share_ptr的轉型函式不能使用c++常用的轉型函式,即static_cast,dynamic_cast,const_cast,而要使用static_pointer_cast,dynamic_pointer_cast,const_pointer_cast。原因有兩個:static_cast,dynamic_cast,const_cast的功能是轉換成對應的模版型別,即static_cast其實是轉換成型別為t的指標;前面說了share_ptr生成的乙個包含型別指標容器物件,使用簡單的c++轉型函式是將share_ptr物件轉型為模版指標物件,這完全違背了使用share_ptr的初衷(除非你確確實實有這種需要!),導致轉型的模版指標物件不能採用share_ptr進行管理。因為上面的兩個原因:share_ptr為了支援轉型,所以提供了類似的轉型函式即static_pointer_cast,從而使轉型後仍然為shared_pointer物件,仍然對指標進行管理;

3、share_ptr類過載了許多的建構函式,其中包含無參的建構函式用來建立乙個持有空指標的share_ptr物件,,注意它不等價於持有void*型的指標物件。要想生成乙個儲存void*型的指標,可以使用share_ptr(void*)建構函式來構造,它相當於乙個泛型的指標容器,擁有容納任意型別的能力,但是將包含void*指標的shared_ptr物件使用注意2中的轉型函式轉型為某種型別的指標會使**不夠安全,一般不要使用;

4、share_ptr完美支援標準容器,並且不需要擔心資源洩漏。而標準容易在使用指標物件時需要特別的小心,對指標需要額外的管理。下面用**範例來演示如何將share_ptr應用與標準容器:

#include

#include

using namespace std;

using namespace boost;

int main ()

cout<

注意上面的**中的標頭檔案#include ,不是常見的#include ,這是因為make_shared.hpp中提供了乙個自由工廠函式make_shared(),來消除顯示的new呼叫,其實是模仿了標準庫中產生pair的函式make_pair().因為make_shared.hpp中包含了smart_ptr.hpp,所以加入了make_shared.hpp就不需要再宣告smart_ptr.hpp標頭檔案了。而smart_ptr.hpp沒有包含make_shared.hpp,所以必須要單獨寫出make_shared.hpp。

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

在平時編寫 的時候經常會用到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...