1、智能指針
創(chuàng)新互聯(lián)專注于醴陵企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,購(gòu)物商城網(wǎng)站建設(shè)。醴陵網(wǎng)站建設(shè)公司,為醴陵等地區(qū)提供建站服務(wù)。全流程按需求定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)VC版 Linux下的STL 2種智能指針
boost庫(kù)下的:scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr、instrusive_ptr 6種智能指針;
boost庫(kù)下是極大的充裕了標(biāo)準(zhǔn)C++下的內(nèi)存管理問題,尤其是數(shù)組,寫時(shí)拷貝等得到了極大的補(bǔ)充;
那么智能指針的含義是什么呢?
智能:將所申請(qǐng)到的空間交由一個(gè)對(duì)象去管理,預(yù)防程序中出現(xiàn)異常或者由于自己忘記釋放所申請(qǐng)的空間,造成內(nèi)存泄漏的問題。
指針:通過對(duì)*和->的重載,使其對(duì)象具有指針的特性;
2、VC版的智能指針->auto_ptr
(1)、通過引入頭文件 #include
#include#include #include //在VC下調(diào)用智能指針管理空間所必須的頭文件; using namespace std; int main(){ int *p = new int(10); auto_ptr pa(p);//新開辟空間的地址交由pa對(duì)象去管理,在對(duì)象消亡時(shí),調(diào)用析構(gòu)函數(shù)釋放空間;將不會(huì)發(fā)生內(nèi)存泄漏; return 0; //因?yàn)閷㈤_辟出來(lái)的空間交由對(duì)象去管理,在最后析構(gòu)時(shí)其內(nèi)部必有delete,去釋放空間; }
auto_ptr的內(nèi)部具體實(shí)現(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開辟一個(gè)×××空間; auto_ptrpa(p); //將空間的地址交由pa對(duì)象來(lái)管理; cout<<*pa< 此時(shí)的模型如下:
其后就是根據(jù)源碼寫的智能指針的整個(gè)過程并進(jìn)行剖析:
#includeusing namespace std; template //所管理的空間類型不定,所以用模板 class auto_ptr{ //VC下的空間管理交由auto_ptr這種類進(jìn)行處理 public: auto_ptr(_Ty *_P=0) : _Owns(_P!=0),_Ptr(_P){} //構(gòu)造函數(shù),當(dāng)申請(qǐng)空間成功時(shí),_Owns為1,_ptr也指向那個(gè)空間; auto_ptr(const auto_ptr<_Ty> &_Y):_Owns(_Y._Owns),_Ptr(_Y.release()){}//拷貝構(gòu)造函數(shù),進(jìn)行了擁有權(quán)的轉(zhuǎn)移; auto_ptr<_Ty>& operator=(const auto_ptr<_Ty> &_Y){ //賦值語(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*(){ //對(duì)*進(jìn)行了運(yùn)算符重載, return *_Ptr; //返回其空間中的內(nèi)容 } _Ty* operator->(){ //對(duì)->進(jìn)行了運(yùn)算符重載, return _Ptr; ////返回其空間的地址 } //_Ty* release(const auto_ptr<_Ty> *const this) //其改寫后的函數(shù)本質(zhì) _Ty* release()const{ //這個(gè)函數(shù)時(shí)進(jìn)行擁有權(quán)的轉(zhuǎn)移; ((auto_ptr<_Ty>*)this)->_Owns = false; //因?yàn)閏onst常量,不能更改,所以通過強(qiáng)制類型轉(zhuǎn)換對(duì)其進(jìn)行更改; //_Owns = false; return _Ptr; //返回這個(gè)地址 } private: //mutable bool _Owns; bool _Owns; _Ty *_Ptr; }; int main(){ int *p = new int(10); //開辟了一個(gè)×××空間,交給了p; auto_ptr pa(p); //將開辟出的空間地址交給了pa對(duì)象來(lái)管理; cout<<*pa< pa1(pa); //此時(shí)擁有權(quán)的轉(zhuǎn)移;空間交由pa1去管理,不關(guān)pa什么事了; auto_ptr pa2; pa2 = pa1; //擁有權(quán)在次轉(zhuǎn)移給pa2對(duì)象,此時(shí)與前面的pa,pa1應(yīng)該沒有什么關(guān)系了; return 0; } 對(duì)賦值語(yǔ)句的兩種模型進(jìn)行畫圖解釋:
_Ptr != _Y._Ptr; //這種是空間不同下對(duì)象的管理賦值情況:_Ptr == _Y._Ptr;//此時(shí),只要進(jìn)行擁有權(quán)的交換即可;3、總結(jié)
auto_ptr 本質(zhì):對(duì)象,但是用起來(lái)像指針(* ->的重載)
RAII:將自動(dòng)調(diào)用構(gòu)造函數(shù),在對(duì)象消亡時(shí)在自動(dòng)的調(diào)用析構(gòu)函數(shù),只有這樣才為智能指針的出現(xiàn)提供了可能。
VC版的實(shí)現(xiàn):擁有權(quán)的轉(zhuǎn)移,_Owns(此成員起的作用)
缺點(diǎn):在_Owns為1/0時(shí)(這個(gè)牽扯到釋放空間),*pa對(duì)象都可訪問,就是那個(gè)地址還保留著,轉(zhuǎn)移的不徹底,存在安全隱患!??!
以上就是我對(duì)VC下auto_ptr智能指針的認(rèn)識(shí)了;
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章標(biāo)題:智能指針VC版-創(chuàng)新互聯(lián)
瀏覽地址:http://weahome.cn/article/jshhi.html