• <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)  編輯 收藏 引用

            中文字幕亚洲综合久久2| 国产精品中文久久久久久久| 国产精品久久久久国产A级| 国内精品久久久久| 欧洲性大片xxxxx久久久| 欧美日韩久久中文字幕| 996久久国产精品线观看| 亚洲国产精品久久久久网站| 久久精品成人| 国产V综合V亚洲欧美久久| 91久久精品国产成人久久| 久久无码AV中文出轨人妻| 国内精品久久久久久99蜜桃| 久久久亚洲精品蜜桃臀| 国产精品毛片久久久久久久| 亚洲色欲久久久久综合网| 久久久精品国产sm调教网站| 亚洲精品无码久久久久AV麻豆| 久久天堂AV综合合色蜜桃网| 亚洲伊人久久综合中文成人网| 久久免费美女视频| 久久天天躁狠狠躁夜夜avapp| yy6080久久| 人妻少妇精品久久| 久久国产香蕉一区精品| 国产亚洲婷婷香蕉久久精品| 亚洲精品乱码久久久久久中文字幕| 精品久久久无码中文字幕| 国产精品久久久久久影院| 日本欧美久久久久免费播放网| 青青草国产97免久久费观看| 精品无码人妻久久久久久| 亚洲欧美精品伊人久久| 青青草原1769久久免费播放| 国产精品久久久久久福利漫画| 国产成人综合久久综合 | 精品久久无码中文字幕| 久久久久亚洲AV片无码下载蜜桃| 香蕉aa三级久久毛片| 久久精品极品盛宴观看| 亚洲中文字幕无码久久2017|