• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            jake1036

            面試100 30異常安全的復制

                   面試100 30異常安全的賦值運算符重載函數

                當賦值運算符重載函數中有指針變量的時候,需要保證在發生異常的時候,對象的原有狀態不發生改變。
               
               考慮下面的 未注意的代碼
              

            #include <iostream>
             
            using namespace std ;
             
            class MyString
             
            {
                
            public :
                   MyString() ;
                   MyString(
            const MyString & rfs) ;           
                   MyString 
            & operator = (const MyString & rfs) ;
                   
            ~MyString() ;
             
                
            private :
                
            char * data ;
                   
             }
             ;
             
             MyString 
            & MyString::operator = (const MyString & rfs) //普通的賦值操作符重載函數 
             {
               
            if(this == &rfs)
                 
            return *this;
               
            //接下來判斷原來對象的heap成員是否已經刪除,若未刪除,則首先執行刪除操作  
                if(data)
                  
            {
                    delete [] data ;
                    data 
            = 0 ;
                          
                  }

                  data 
            = new char[strlen(rfs.data) + 1] ; //這可能會導致申請內存失敗,造成原有對象狀態被更改并無法回復 
                  strcpy(data , rfs.data) ;
                  
            return *this ;      
                        
             }


               上面申請內存空間的時候,可能會發生異常,但此時原有的內存空間已經釋放,這樣的話對象的狀態被改變了。

              解決1 :

                考慮在分配內存空間的時候,先用一個輔助指針,指向新申請的內存空間,等申請成功的時候,再將原有對象的指針空間刪除,
               將對象指針指向臨時指針指向的空間。
              代碼如下:
               

             //方法1 先在內存申請一塊臨時變量,申請成功的話,才會將this指針指向的原內存刪除,將臨時指針賦予 
              MyString & MyString::operator = (const MyString & rfs) //普通的賦值操作符重載函數 
             {
               
            if(this == &rfs)
                  
            return *this;
                
            char * temp = new char[strlen(rfs.data) + 1] ; //首先申請一塊臨時內存,以防止申請失敗 
                strcpy(temp , rfs.data) ;
               
            //只有上述內存申請成功,才進行刪除原有的占用空間  
                if(data)
                  
            {
                    delete [] data ;
                    data 
            = 0 ;
                          
                  }
                
                  
            this->data = temp ; //指向臨時申請內存 
                  return *this ;                
             }



            方法2 :
               使用copy構造函數,建立一個臨時對象,建立成功之后,將臨時對象的指針與原對象交換。
              代碼如下:
              

             //方法2.優雅的方法,在棧中使用copy構造函數,建立一個臨時變量,建立成功之后。才執行內存中指針變量的復制 
              MyString & MyString::operator = (const MyString & rfs) //普通的賦值操作符重載函數 
             {
               
            if(this == &rfs)
                  
            return *this;
                MyString tempStr(rfs.str) ;
                
            char * temp = tempStr.data ; //使用copy構造函數,在棧中申明變量 
                tempStr.data = this->data ;  //交換兩者的成員變量 
                this->data = temp ;          //結束的時候,tempStr會自動調用析構函數,將資源釋放 
                return *this ;      
                        
             }








             

            posted on 2011-05-20 14:31 kahn 閱讀(161) 評論(0)  編輯 收藏 引用

            久久99精品久久久久久9蜜桃| 亚洲色大成网站WWW久久九九| 久久国产精品久久久| 久久狠狠高潮亚洲精品| www.久久热.com| 久久亚洲中文字幕精品一区四| 中文字幕无码久久精品青草| 无码人妻精品一区二区三区久久| 成人久久综合网| 亚洲七七久久精品中文国产| 国内精品人妻无码久久久影院| 精品久久久久久综合日本| 亚洲国产成人精品女人久久久 | 久久综合精品国产一区二区三区 | 亚洲欧洲久久久精品| 无码AV波多野结衣久久| 久久夜色精品国产亚洲| 99精品久久精品一区二区| 9999国产精品欧美久久久久久 | 国产ww久久久久久久久久| 99久久这里只精品国产免费| 国产精品一区二区久久不卡| 色播久久人人爽人人爽人人片aV| 久久国产精品无码HDAV| 久久婷婷色香五月综合激情| 99久久亚洲综合精品成人| 亚洲va久久久噜噜噜久久狠狠| 久久国产乱子伦精品免费午夜| 久久久无码精品亚洲日韩按摩| 亚洲国产日韩综合久久精品| 国产精品伊人久久伊人电影 | 久久国产精品一区二区| 午夜人妻久久久久久久久| 一本久久a久久精品综合香蕉| 国产精品美女久久久免费| 97久久久久人妻精品专区| 久久久免费精品re6| 久久99精品久久只有精品| 久久久久女人精品毛片| 婷婷伊人久久大香线蕉AV | 久久精品夜色噜噜亚洲A∨|