• <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 閱讀(164) 評論(0)  編輯 收藏 引用

            大美女久久久久久j久久| 亚洲а∨天堂久久精品| 久久狠狠爱亚洲综合影院| 久久无码中文字幕东京热| 成人久久免费网站| 久久国产精品77777| 国产精品成人久久久久三级午夜电影 | 三级三级久久三级久久| 一本久久知道综合久久| 国产欧美久久久精品| 欧美久久一级内射wwwwww.| 国产毛片欧美毛片久久久 | 久久久久国色AV免费观看| 一本色道久久综合| 国产精品一区二区久久| 久久久久久久综合日本| 亚洲∧v久久久无码精品| 久久精品国产一区二区三区 | 97精品伊人久久久大香线蕉| 亚洲另类欧美综合久久图片区| 国内精品久久九九国产精品| 久久精品国产亚洲AV香蕉| 国产精品99久久精品爆乳| 久久久久久国产精品无码超碰| 午夜精品久久久久成人| 日本福利片国产午夜久久| 久久精品国产亚洲av麻豆色欲| 日韩一区二区三区视频久久| 国产激情久久久久影院老熟女免费 | 久久精品国产亚洲av麻豆图片 | 久久笫一福利免费导航 | 一级做a爰片久久毛片看看 | 久久久无码精品亚洲日韩京东传媒 | 久久国产免费观看精品| 77777亚洲午夜久久多喷| 伊色综合久久之综合久久| 欧美久久久久久午夜精品| 国产精品成人99久久久久91gav | 九九久久99综合一区二区| 99久久国产热无码精品免费| 久久人人爽人人爽人人片av高请|