• <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異常安全的復(fù)制

                   面試100 30異常安全的賦值運(yùn)算符重載函數(shù)

                當(dāng)賦值運(yùn)算符重載函數(shù)中有指針變量的時候,需要保證在發(fā)生異常的時候,對象的原有狀態(tài)不發(fā)生改變。
               
               考慮下面的 未注意的代碼
              

            #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) //普通的賦值操作符重載函數(shù) 
             {
               
            if(this == &rfs)
                 
            return *this;
               
            //接下來判斷原來對象的heap成員是否已經(jīng)刪除,若未刪除,則首先執(zhí)行刪除操作  
                if(data)
                  
            {
                    delete [] data ;
                    data 
            = 0 ;
                          
                  }

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


               上面申請內(nèi)存空間的時候,可能會發(fā)生異常,但此時原有的內(nèi)存空間已經(jīng)釋放,這樣的話對象的狀態(tài)被改變了。

              解決1 :

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

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



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

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








             

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

            国产精品99久久久精品无码| 青青青青久久精品国产 | 久久免费精品视频| 国产精品美女久久久m| 国产叼嘿久久精品久久| 国产99久久久国产精品小说| 人妻无码久久一区二区三区免费| 999久久久无码国产精品| 久久国产视屏| 久久精品无码一区二区无码 | 久久99精品久久久久久9蜜桃| 久久久无码精品午夜| 久久久久亚洲av无码专区喷水 | 国产美女久久精品香蕉69| 国产精品va久久久久久久| 午夜精品久久久久久毛片| 激情久久久久久久久久| 国产精品国色综合久久| 综合久久一区二区三区| 老司机国内精品久久久久| 伊人久久综合成人网| 亚洲国产成人久久综合区| 欧美精品一区二区精品久久| 久久婷婷五月综合成人D啪| 久久精品国产只有精品66| 2021久久精品国产99国产精品 | 日韩亚洲欧美久久久www综合网| 无码任你躁久久久久久老妇App| 久久99精品久久久久久水蜜桃| 成人免费网站久久久| 久久夜色精品国产噜噜噜亚洲AV| 噜噜噜色噜噜噜久久| 亚洲精品国产综合久久一线| 久久婷婷色综合一区二区| 国内精品久久久久久麻豆| 97久久精品人人澡人人爽| 99久久伊人精品综合观看| 国产精品成人精品久久久| 久久国产免费直播| 亚洲国产成人久久综合区| 久久国产色av免费看|