這篇文章主要為大家展示了“如何實(shí)現(xiàn)auto_ptr”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何實(shí)現(xiàn)auto_ptr”這篇文章吧。
我們一直強(qiáng)調(diào)成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)對(duì)于企業(yè)的重要性,如果您也覺(jué)得重要,那么就需要我們慎重對(duì)待,選擇一個(gè)安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過(guò)程中的有力推手。專業(yè)網(wǎng)站建設(shè)公司不一定是大公司,創(chuàng)新互聯(lián)建站作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。
實(shí)現(xiàn)auto_ptr有兩種方法:
第一種方法:在上一篇博客中我已經(jīng)實(shí)現(xiàn)了,主要思想是管理權(quán)轉(zhuǎn)移。
第二種方法:它是我們c++標(biāo)準(zhǔn)庫(kù)中以前的一個(gè)版本,主要思想是在auto_ptr類中除了有一個(gè)指針的成員變量以外還有一個(gè)bool類型的成員變量_owner。構(gòu)造函數(shù)中將_owner設(shè)為真,表示對(duì)象是指針?biāo)赶虻膬?nèi)存的擁有者,當(dāng)要賦值時(shí)(ap1=ap2),將ap1的_owner置為true,ap2的_owner置為false。
這樣我們析構(gòu)對(duì)象時(shí)只要檢查它的_owner是否為true。為真就釋放內(nèi)存,不為真就不釋放。
主要實(shí)現(xiàn)如下:
#includeusing namespace std; template class AutoPtr { public: AutoPtr(T* ptr) :_ptr(ptr) , _owner(true) {} ~AutoPtr() { if (_owner) { delete _ptr; } } AutoPtr(AutoPtr & ap) :_ptr(ap._ptr) , _owner(true) { ap._owner = false; } AutoPtr& operator=(AutoPtr & ap) { if (this != &ap) { if (_owner) { delete _ptr; } _ptr = ap._ptr; _owner = true; ap._owner = false; } return *this; } T* operator->() { return _ptr; } T& operator*() { return *_ptr; } private: T* _ptr; bool _owner; };
看完auto_ptr的實(shí)現(xiàn),有人會(huì)問(wèn):
看起來(lái)這種方法更好些,它實(shí)現(xiàn)了可以一般指針的使用方式,可以有多個(gè)指針指向同一塊內(nèi)存,并且都可以訪問(wèn)這塊內(nèi)存,而我們知道,新版本的auto_ptr的實(shí)現(xiàn)方式(管理權(quán)轉(zhuǎn)移)最大的缺點(diǎn)就是不能有幾個(gè)指針指向同一塊內(nèi)存,一個(gè)智能指針只能指向一塊內(nèi)存。
既然舊版本的智能指針實(shí)現(xiàn)方式比新版本的要好用,那為什么會(huì)被替換呢?
請(qǐng)看下面一段代碼:
AutoPtrap1(new int(1)); if (1) { AutoPtr ap2(ap1); } *ap1 = 3;
這段代碼是用舊版本實(shí)現(xiàn)的智能指針(ap1)指向一個(gè)動(dòng)態(tài)開(kāi)辟的內(nèi)存,然后在if條件語(yǔ)句中又有一個(gè)ap2指向這塊內(nèi)存,我們會(huì)知道,根據(jù)舊版的智能指針的實(shí)現(xiàn)原理,ap1的_owner為false,ap2的_owner為true。那么除了if條件語(yǔ)句的局部作用域,ap2就自動(dòng)調(diào)用析構(gòu)函數(shù)釋放內(nèi)存,那么當(dāng)我們?cè)谕饷?ap1=3時(shí),訪問(wèn)到的是一塊已經(jīng)被釋放了的內(nèi)存,那么程序這時(shí)就會(huì)出現(xiàn)問(wèn)題。
如果是新版的auto_ptr,它提供了一個(gè)公有成員函數(shù)GetPtr(),可以獲取指針_ptr,當(dāng)發(fā)生這種情況時(shí),它可以先判斷_ptr是否為空,然后才去訪問(wèn)內(nèi)存。舊版本這樣做是無(wú)用的,因?yàn)閍p1的_ptr并不為空。
以上是“如何實(shí)現(xiàn)auto_ptr”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!