溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何實(shí)現(xiàn)auto_ptr

發(fā)布時(shí)間:2021-10-21 11:09:44 來源:億速云 閱讀:134 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“如何實(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è)資訊頻道!

向AI問一下細(xì)節(jié)

免責(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)容。

AI