初识boost之boost::share_ptr用法
boost中提供了幾種智能指針方法:scoped_ptr shared_ptr intrusive_ptr weak_ptr,而標(biāo)準(zhǔn)庫中提供的智能指針為auto_ptr.?
這其中,我最喜歡,使用最多的是shared_ptr,也最讓人隨心所欲.?
使用很簡單,如下:?
頭文件 <boost/shared_ptr.hpp>?
class A?
{?
??virtual void process();?
}?
boost::shared_ptr<A> test(new A);?
boost::shared_ptr通過重載->(返回傳入的指針),test的使用就如同一個(gè)指針。其實(shí)test是一個(gè)對象。?
當(dāng)發(fā)生引用時(shí),boost::shared_ptr<A> test1 = test; test1與test共享構(gòu)造的A指針,引用計(jì)算加一。當(dāng)析夠發(fā)生時(shí),計(jì)算器減一,當(dāng)計(jì)數(shù)器為0,刪除內(nèi)嵌指針。?
常用的boost::shared_ptr函數(shù)有:?
get() 獲取裸指針?
reset() 計(jì)數(shù)器減一?
另外,boost::shared_ptr可以方便的和std::vector配合,除了不用擔(dān)心節(jié)點(diǎn)的野指針等問題,還有一個(gè)比較有意思的功能。?
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有個(gè)一個(gè)缺點(diǎn),就是不能從this指針構(gòu)造。在boost庫中,提供了一個(gè)解決方案。?
#include <boost/enable_shared_from_this.hpp>?
class C: public boost::enable_shared_from_this<C> //?
{?
}?
這個(gè)情況出現(xiàn)在什么時(shí)候呢,如:?
class D?
{?
public:?
void Go(boost::shared_ptr<C> &d);?
}?
而D的Go方法在C中被使用,這個(gè)時(shí)候,就需要從this指針構(gòu)造C的智能指針(boost::shared_from_this()方法提供)。當(dāng)然,這種方法有一個(gè)前提,那就是C在外部的形態(tài)也是智能指針。?
最后,對所有智能指針做一下簡單的介紹吧。?
auto_ptr 標(biāo)準(zhǔn)庫中的智能指針。但是會轉(zhuǎn)移所有權(quán),如a = b時(shí);內(nèi)嵌的指針轉(zhuǎn)移到b,智能指針a訪問內(nèi)嵌的指針則為空。?
scoped_ptr 與auto_ptr類似,但是不允許復(fù)制;?
intrusive_ptr是shared_ptr侵入式版本。使用情況,內(nèi)部以及編寫好了自己的內(nèi)部引用計(jì)算器的代碼,而又沒有時(shí)間重寫它。intrusive_ptr可以從this構(gòu)造。?
weak_ptr是智能指針shared_ptr的觀察者。
轉(zhuǎn)載于:https://www.cnblogs.com/weizhixiang/p/5795555.html
總結(jié)
以上是生活随笔為你收集整理的初识boost之boost::share_ptr用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吐槽一下博客园
- 下一篇: 九度oj 题目1374:所有员工年龄排序