您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“如何實(shí)現(xiàn)auto_ptr”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何實(shí)現(xiàn)auto_ptr”這篇文章吧。
實(shí)現(xiàn)auto_ptr有兩種方法:
第一種方法:在上一篇博客中我已經(jīng)實(shí)現(xiàn)了,主要思想是管理權(quán)轉(zhuǎn)移。
第二種方法:它是我們c++標(biāo)準(zhǔn)庫中以前的一個(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)如下:
#include<iostream> using namespace std; template<class T> class AutoPtr { public: AutoPtr(T* ptr) :_ptr(ptr) , _owner(true) {} ~AutoPtr() { if (_owner) { delete _ptr; } } AutoPtr(AutoPtr<T>& ap) :_ptr(ap._ptr) , _owner(true) { ap._owner = false; } AutoPtr& operator=(AutoPtr<T>& 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ì)問:
看起來這種方法更好些,它實(shí)現(xiàn)了可以一般指針的使用方式,可以有多個(gè)指針指向同一塊內(nèi)存,并且都可以訪問這塊內(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)看下面一段代碼:
AutoPtr<int> ap1(new int(1)); if (1) { AutoPtr<int> ap2(ap1); } *ap1 = 3;
這段代碼是用舊版本實(shí)現(xiàn)的智能指針(ap1)指向一個(gè)動(dòng)態(tài)開辟的內(nèi)存,然后在if條件語句中又有一個(gè)ap2指向這塊內(nèi)存,我們會(huì)知道,根據(jù)舊版的智能指針的實(shí)現(xiàn)原理,ap1的_owner為false,ap2的_owner為true。那么除了if條件語句的局部作用域,ap2就自動(dòng)調(diào)用析構(gòu)函數(shù)釋放內(nèi)存,那么當(dāng)我們?cè)谕饷?ap1=3時(shí),訪問到的是一塊已經(jīng)被釋放了的內(nèi)存,那么程序這時(shí)就會(huì)出現(xiàn)問題。
如果是新版的auto_ptr,它提供了一個(gè)公有成員函數(shù)GetPtr(),可以獲取指針_ptr,當(dāng)發(fā)生這種情況時(shí),它可以先判斷_ptr是否為空,然后才去訪問內(nèi)存。舊版本這樣做是無用的,因?yàn)閍p1的_ptr并不為空。
以上是“如何實(shí)現(xiàn)auto_ptr”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。