实现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并不為空。
轉(zhuǎn)載于:https://blog.51cto.com/haipi/1760289
總結(jié)
以上是生活随笔為你收集整理的实现auto_ptr的两种方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习汇编
- 下一篇: iTween基础之Color(变换颜色)