<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    boost::share_ptr用法

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

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

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全