boost::share_ptr用法

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的觀察者。node

相關文章
相關標籤/搜索