boost::share_ptr用法

來源:互聯網
上載者:User

標籤:使用   os   檔案   ar   問題   代碼   amp   時間   

boost中提供了幾種智能指標方法:scoped_ptr shared_ptr intrusive_ptr weak_ptr,而標準庫中提供的智能指標為auto_ptr. 
這其中,我最喜歡,使用最多的是shared_ptr,也最讓人隨心所欲. 
使用很簡單,如下: 
標頭檔 <boost/shared_ptr.hpp> 
class A 
{ 
  virtual void process(); 
} 
boost::shared_ptr<A> test(new A); 
boost::shared_ptr通過重載->(返回傳入的指標),test的使用就如同一個指標。其實test是一個對象。 
當發生引用時,boost::shared_ptr<A> test1 = test; test1與test共用構造的A指標,引用計算加一。當析夠發生時,計算機減一,當計數器為0,刪除內嵌指標。 

常用的boost::shared_ptr函數有: 
get() 擷取裸指標 
reset() 計數器減一 

另外,boost::shared_ptr可以方便的和std::vector配合,除了不用擔心節點的野指標等問題,還有一個比較有意思的功能。 
class B : public A 
{ 
virtual void process(); 
void do(); 
} 
std::vector< boost::shared_ptr<A> > vect; 
boost::shared_ptr<B> node = boost::shared_ptr<B>(new B); 
vect.push_back(node); 
vect[0]->do(); //可以很方便的訪問B::do(),要知道do()並不是A的方法。 
boost::shared_ptr有個一個缺點,就是不能從this指標構造。在boost庫中,提供了一個解決方案。 
#include <boost/enable_shared_from_this.hpp> 
class C: public boost::enable_shared_from_this<C> // 
{ 
} 
這個情況出現在什麼時候呢,如: 
class D 
{ 
public: 
void Go(boost::shared_ptr<C> &d); 
} 
而D的Go方法在C中被使用,這個時候,就需要從this指標構造C的智能指標(boost::shared_from_this()方法提供)。當然,這種方法有一個前提,那就是C在外部的形態也是智能指標。 

最後,對所有智能指標做一下簡單的介紹吧。 
auto_ptr 標準庫中的智能指標。但是會轉移所有權,如a = b時;內嵌的指標轉移到b,智能指標a訪問內嵌的指標則為空白。 
scoped_ptr 與auto_ptr類似,但是不允許複製; 
intrusive_ptr是shared_ptr侵入式版本。使用方式,內部以及編寫好了自己的內部引用計算機的代碼,而又沒有時間重寫它。intrusive_ptr可以從this構造。 
weak_ptr是智能指標shared_ptr的觀察者。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.