您好,登錄后才能下訂單哦!
1、智能指針
VC版 Linux下的STL 2種智能指針
boost庫下的:scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr、instrusive_ptr 6種智能指針;
boost庫下是極大的充裕了標準C++下的內(nèi)存管理問題,尤其是數(shù)組,寫時拷貝等得到了極大的補充;
那么智能指針的含義是什么呢?
智能:將所申請到的空間交由一個對象去管理,預(yù)防程序中出現(xiàn)異?;蛘哂捎谧约和涐尫潘暾埖目臻g,造成內(nèi)存泄漏的問題。
指針:通過對*和->的重載,使其對象具有指針的特性;
2、VC版的智能指針->auto_ptr
(1)、通過引入頭文件 #include<memory>;
#include<iostream> #include<stdio.h> #include<memory> //在VC下調(diào)用智能指針管理空間所必須的頭文件; using namespace std; int main(){ int *p = new int(10); auto_ptr<int> pa(p);//新開辟空間的地址交由pa對象去管理,在對象消亡時,調(diào)用析構(gòu)函數(shù)釋放空間;將不會發(fā)生內(nèi)存泄漏; return 0; //因為將開辟出來的空間交由對象去管理,在最后析構(gòu)時其內(nèi)部必有delete,去釋放空間; }
auto_ptr的內(nèi)部具體實現(xiàn)過程是怎樣的呢?
其私有數(shù)據(jù)的成員有:
class auto_ptr{ public: ...... //構(gòu)造函數(shù)在此都一一賦值了; private: bool _Owns; //空間所有權(quán)的管理者,為1釋放空間; _Ty *_Ptr; //保存所開辟空間的地址; }; int main(){ int *p = new int(10); //通過new開辟一個×××空間; auto_ptr<int> pa(p); //將空間的地址交由pa對象來管理; cout<<*pa<<endl; }
此時的模型如下:
其后就是根據(jù)源碼寫的智能指針的整個過程并進行剖析:
#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){} //構(gòu)造函數(shù),當(dāng)申請空間成功時,_Owns為1,_ptr也指向那個空間; auto_ptr(const auto_ptr<_Ty> &_Y):_Owns(_Y._Owns),_Ptr(_Y.release()){}//拷貝構(gòu)造函數(shù),進行了擁有權(quán)的轉(zhuǎn)移; auto_ptr<_Ty>& operator=(const auto_ptr<_Ty> &_Y){ //賦值語句是關(guān)鍵,抓住那4步: if(this != &_Y){ //1、判斷自己是否給自己賦值 if(_Ptr != _Y._Ptr){ //賦值的地址不相等 if(_Owns) //要賦的先判斷是否為1 delete _Ptr; //釋放原先空間 } _Owns = _Y._Owns; _Ptr = _Y.release(); //擁有權(quán)的轉(zhuǎn)移; } return *this; } ~auto_ptr(){ if(_Owns) delete _Ptr; } public: _Ty& operator*(){ //對*進行了運算符重載, return *_Ptr; //返回其空間中的內(nèi)容 } _Ty* operator->(){ //對->進行了運算符重載, return _Ptr; ////返回其空間的地址 } //_Ty* release(const auto_ptr<_Ty> *const this) //其改寫后的函數(shù)本質(zhì) _Ty* release()const{ //這個函數(shù)時進行擁有權(quán)的轉(zhuǎn)移; ((auto_ptr<_Ty>*)this)->_Owns = false; //因為const常量,不能更改,所以通過強制類型轉(zhuǎn)換對其進行更改; //_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); //此時擁有權(quán)的轉(zhuǎn)移;空間交由pa1去管理,不關(guān)pa什么事了; auto_ptr<int> pa2; pa2 = pa1; //擁有權(quán)在次轉(zhuǎn)移給pa2對象,此時與前面的pa,pa1應(yīng)該沒有什么關(guān)系了; return 0; }
對賦值語句的兩種模型進行畫圖解釋:
_Ptr != _Y._Ptr; //這種是空間不同下對象的管理賦值情況:
_Ptr == _Y._Ptr;//此時,只要進行擁有權(quán)的交換即可;
3、總結(jié)
auto_ptr 本質(zhì):對象,但是用起來像指針(* ->的重載)
RAII:將自動調(diào)用構(gòu)造函數(shù),在對象消亡時在自動的調(diào)用析構(gòu)函數(shù),只有這樣才為智能指針的出現(xiàn)提供了可能。
VC版的實現(xiàn):擁有權(quán)的轉(zhuǎn)移,_Owns(此成員起的作用)
缺點:在_Owns為1/0時(這個牽扯到釋放空間),*pa對象都可訪問,就是那個地址還保留著,轉(zhuǎn)移的不徹底,存在安全隱患!??!
以上就是我對VC下auto_ptr智能指針的認識了;
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。