中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

智能指針 VC版

發布時間:2020-07-17 08:10:57 來源:網絡 閱讀:420 作者:匯天下豪杰 欄目:編程語言

1、智能指針

  VC版   Linux下的STL  2種智能指針

  boost庫下的:scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr、instrusive_ptr 6種智能指針;

  boost庫下是極大的充裕了標準C++下的內存管理問題,尤其是數組,寫時拷貝等得到了極大的補充;

  那么智能指針的含義是什么呢?

  智能:將所申請到的空間交由一個對象去管理,預防程序中出現異常或者由于自己忘記釋放所申請的空間,造成內存泄漏的問題。

  指針:通過對*和->的重載,使其對象具有指針的特性

2、VC版的智能指針->auto_ptr

  (1)、通過引入頭文件 #include<memory>;

#include<iostream>
#include<stdio.h>
#include<memory>  //在VC下調用智能指針管理空間所必須的頭文件;
using namespace std;

int main(){
    int *p = new int(10);
    auto_ptr<int> pa(p);//新開辟空間的地址交由pa對象去管理,在對象消亡時,調用析構函數釋放空間;將不會發生內存泄漏;
    return 0;           //因為將開辟出來的空間交由對象去管理,在最后析構時其內部必有delete,去釋放空間;
}

  auto_ptr的內部具體實現過程是怎樣的呢?

 其私有數據的成員有:

class auto_ptr{
public:
    ......  //構造函數在此都一一賦值了;
private:
    bool _Owns;  //空間所有權的管理者,為1釋放空間;
    _Ty *_Ptr;   //保存所開辟空間的地址;
};
int main(){
    int *p = new int(10); //通過new開辟一個×××空間;
    auto_ptr<int> pa(p);  //將空間的地址交由pa對象來管理;
    cout<<*pa<<endl;
}

此時的模型如下:

智能指針 VC版

其后就是根據源碼寫的智能指針的整個過程并進行剖析:

#include<iostream>
using namespace std;

template<class _Ty>   //所管理的空間類型不定,所以用模板
class auto_ptr{       //VC下的空間管理交由auto_ptr這種類進行處理
public:
    auto_ptr(_Ty *_P=0) : _Owns(_P!=0),_Ptr(_P){}  //構造函數,當申請空間成功時,_Owns為1,_ptr也指向那個空間;
    auto_ptr(const auto_ptr<_Ty> &_Y):_Owns(_Y._Owns),_Ptr(_Y.release()){}//拷貝構造函數,進行了擁有權的轉移;
    auto_ptr<_Ty>& operator=(const auto_ptr<_Ty> &_Y){  //賦值語句是關鍵,抓住那4步:
        if(this != &_Y){  //1、判斷自己是否給自己賦值
            if(_Ptr != _Y._Ptr){  //賦值的地址不相等
                if(_Owns)   //要賦的先判斷是否為1
                    delete _Ptr;  //釋放原先空間
            }
            _Owns = _Y._Owns;    
            _Ptr = _Y.release(); //擁有權的轉移;
        }
        return *this;
    }
    ~auto_ptr(){
        if(_Owns)
            delete _Ptr;
    }
public:
    _Ty& operator*(){ //對*進行了運算符重載,
        return *_Ptr;  //返回其空間中的內容
    }
    _Ty* operator->(){ //對->進行了運算符重載,
        return _Ptr;   ////返回其空間的地址
    }
    //_Ty* release(const auto_ptr<_Ty> *const this)  //其改寫后的函數本質
    _Ty* release()const{   //這個函數時進行擁有權的轉移;
        ((auto_ptr<_Ty>*)this)->_Owns = false; //因為const常量,不能更改,所以通過強制類型轉換對其進行更改;
        //_Owns = false;
        return _Ptr;  //返回這個地址
    }
private:
    //mutable bool _Owns;
    bool _Owns;
    _Ty *_Ptr;
};

int main(){
    int *p = new int(10); //開辟了一個×××空間,交給了p;
    auto_ptr<int> pa(p);  //將開辟出的空間地址交給了pa對象來管理;
    cout<<*pa<<endl;

    auto_ptr<int> pa1(pa); //此時擁有權的轉移;空間交由pa1去管理,不關pa什么事了;

    auto_ptr<int> pa2;
    pa2 = pa1;  //擁有權在次轉移給pa2對象,此時與前面的pa,pa1應該沒有什么關系了;

    return 0;
}

對賦值語句的兩種模型進行畫圖解釋:

_Ptr != _Y._Ptr;  //這種是空間不同下對象的管理賦值情況:

智能指針 VC版

_Ptr == _Y._Ptr;//此時,只要進行擁有權的交換即可;

智能指針 VC版

3、總結

  auto_ptr  本質:對象,但是用起來像指針(* ->的重載)

  RAII:將自動調用構造函數,在對象消亡時在自動的調用析構函數,只有這樣才為智能指針的出現提供了可能。

  VC版的實現:擁有權的轉移,_Owns(此成員起的作用)

  缺點:在_Owns為1/0時(這個牽扯到釋放空間),*pa對象都可訪問,就是那個地址還保留著,轉移的不徹底,存在安全隱患!!!

  以上就是我對VC下auto_ptr智能指針的認識了;


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玛曲县| 赤城县| 定日县| 阳信县| 沐川县| 醴陵市| 东兰县| 亳州市| 淮南市| 融水| 大埔县| 孟村| 徐州市| 龙川县| 元江| 固阳县| 遵义县| 兴隆县| 桐乡市| 云浮市| 剑川县| 佛坪县| 武川县| 柳林县| 凌源市| 和顺县| 左权县| 喀什市| 称多县| 平远县| 土默特右旗| 和林格尔县| 新巴尔虎左旗| 海门市| 广河县| 临武县| 黑山县| 吴旗县| 安远县| 新巴尔虎左旗| 五峰|