溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解Boost庫中的scoped_ptr

發(fā)布時間:2021-11-25 15:28:30 來源:億速云 閱讀:134 作者:柒染 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)如何理解Boost庫中的scoped_ptr,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

1、VC和VS

  VC版并不是標(biāo)準(zhǔn)C++,VS版符合標(biāo)準(zhǔn)C++,其語法相當(dāng)嚴(yán)格。

  缺點:VC和VS都只能釋放一個具體類型空間,不能對數(shù)組空間進(jìn)行釋放,還有寫時拷貝的問題;

  所以引發(fā)了Boost庫的出現(xiàn)來解決此類問題。

2、Boost庫

  推薦看一下Boost庫完全開發(fā)指南。

  Boost本身是開源庫,在C++中的地位舉足輕重,第三章內(nèi)存管理,智能指針;

  C++中也提供了智能指針,但是并不能解決所有問題。

  smart_ptr庫中:new delete的運用不正確,是C++中造成資源獲取/釋放問題的根源,

3、scoped_ptr(局部智能指針)

  (1)、如何使用

  scoped_ptr是一個很類似auto_ptr的智能指針,但是scoped_ptr的所有權(quán)更加嚴(yán)格,不能轉(zhuǎn)讓,一旦scoped_ptr獲取了對象的管理權(quán),你就無法再從它那里取回來。

  平常的智能指針加上#include<memory>頭文件,Boost庫的搭建,就是拷到相應(yīng)的目錄下;然后編譯,出錯進(jìn)去把該注釋的都注釋上。

#include<iostream>
#include<string>
#include<boost/smart_ptr.hpp> //:在include目錄下的boost目錄下的smart_ptr.hpp;
using namespace std;                    //打開就是其它智能指針的聲明;                    
using namespace boost;  //boost庫必須引入的命名空間


int main(void){
    int *p = new int(10);

    scoped_ptr<int> ps(p);
    cout<<*ps<<endl;  //有了指針功能*運算符
    string *px = new string("hello");
    scoped_ptr<string> ps1(px);
    cout<<ps1->size()<<endl;//有了->,指針
}

在庫的引入下,確實具有智能指針的特性。必須加上

#include<boost/smart_ptr.hpp>  和  using namespace boost;,才具有智能指針的特性。

  對比:VC和VS版的拷貝構(gòu)造,賦值都沒問題,

  scoped_ptr(局部智能指針),對空間的管理權(quán)不能交由其它對象,不能進(jìn)行拷貝構(gòu)造和賦值。

4、scoped_ptr的內(nèi)部實現(xiàn)過程

  如何達(dá)到擁有權(quán)不能轉(zhuǎn)移的目的,拷貝構(gòu)造和賦值語句聲明為私有的,不需要實現(xiàn)。

  模擬源碼實現(xiàn)如下:

#include<iostream>
using namespace std;                            

template<class T>
class scoped_ptr{
public:
    scoped_ptr(T *p = 0) : px(p){}
    ~scoped_ptr(){
        delete px;
    }
public:
    T& operator*()const{
        return *px;
    }
    T* operator->()const{
        return px;
    }
    T* get()const{
        return px;
    }/*
    void reset(T *p = 0){
        if(p != px && px){
            delete px;
        }
        px = p;
    }*/ //boost庫中有一個更好的解決方案
    typedef scoped_ptr<T> this_type;
    void reset(T *p = 0){
        this_type(p).swap(*this); //無名臨時對象技術(shù)
    }
    void swap(scoped_ptr &b){
        T *tmp = b.px;
        b.px = px;
        px = tmp;
    }
private: //不想讓其擁有哪些功能,聲明為私有即可。
    scoped_ptr(const scoped_ptr<T> &);//聲明為私有,外部就無法進(jìn)行拷貝構(gòu)造了
    scoped_ptr& operator=(const scoped_ptr<T> &);//外部就調(diào)不動賦值語句了
    void operator==(scoped_ptr const &) const;  //對象不具有比較==
    void operator!=(scoped_ptr const &) const;  //對象不具有比較!=
    T *px;
};

class Test{
public:
    void fun(){
        cout<<"This is Test fun()"<<endl;
    }
};

int main(void){
    int *p = new int(10);

    scoped_ptr<int> ps(p);
    cout<<*ps<<endl;
    int *q = new int(20);
    ps.reset(q); //重新設(shè)置函數(shù),將原有空間釋放,重新管理一個空間

    
    scoped_ptr<Test> ps1(new Test);
    ps1->fun();
}

對reset()函數(shù)的理解:this_type(p).swap(*this);模型如下:

如何理解Boost庫中的scoped_ptr

通過新生成的無名臨時變量,將新地址與舊地址交換,在最后脫離函數(shù)范圍,對象消亡,調(diào)用析構(gòu)函數(shù),釋放

原先空間,達(dá)到不內(nèi)存泄漏,并且對新空間進(jìn)行管理。

缺點:不能對數(shù)組空間進(jìn)行管理。

關(guān)于如何理解Boost庫中的scoped_ptr就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI