溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現auto_ptr

發布時間:2021-10-21 11:09:44 來源:億速云 閱讀:149 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“如何實現auto_ptr”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何實現auto_ptr”這篇文章吧。

實現auto_ptr有兩種方法:

第一種方法:在上一篇博客中我已經實現了,主要思想是管理權轉移。

第二種方法:它是我們c++標準庫中以前的一個版本,主要思想是在auto_ptr類中除了有一個指針的成員變量以外還有一個bool類型的成員變量_owner。構造函數中將_owner設為真,表示對象是指針所指向的內存的擁有者,當要賦值時(ap1=ap2),將ap1的_owner置為true,ap2的_owner置為false。

這樣我們析構對象時只要檢查它的_owner是否為true。為真就釋放內存,不為真就不釋放。

主要實現如下:

#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的實現,有人會問:

看起來這種方法更好些,它實現了可以一般指針的使用方式,可以有多個指針指向同一塊內存,并且都可以訪問這塊內存,而我們知道,新版本的auto_ptr的實現方式(管理權轉移)最大的缺點就是不能有幾個指針指向同一塊內存,一個智能指針只能指向一塊內存。

既然舊版本的智能指針實現方式比新版本的要好用,那為什么會被替換呢?

請看下面一段代碼:

AutoPtr<int> ap1(new int(1));

 if (1)

 {

  AutoPtr<int> ap2(ap1);

 }

 *ap1 = 3;

這段代碼是用舊版本實現的智能指針(ap1)指向一個動態開辟的內存,然后在if條件語句中又有一個ap2指向這塊內存,我們會知道,根據舊版的智能指針的實現原理,ap1的_owner為false,ap2的_owner為true。那么除了if條件語句的局部作用域,ap2就自動調用析構函數釋放內存,那么當我們在外面*ap1=3時,訪問到的是一塊已經被釋放了的內存,那么程序這時就會出現問題。

如果是新版的auto_ptr,它提供了一個公有成員函數GetPtr(),可以獲取指針_ptr,當發生這種情況時,它可以先判斷_ptr是否為空,然后才去訪問內存。舊版本這樣做是無用的,因為ap1的_ptr并不為空。

以上是“如何實現auto_ptr”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女