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

            国产精品中文久久久久久久| 亚洲午夜无码久久久久| 人人狠狠综合久久亚洲88| 久久国产精品免费| 久久乐国产综合亚洲精品| 欧美喷潮久久久XXXXx| 久久这里只有精品久久| 亚洲人成无码网站久久99热国产 | 国产精品美女久久福利网站| 亚洲中文字幕无码久久精品1| 久久成人国产精品二三区| 久久人人爽人人爽人人片AV不| 91精品国产综合久久婷婷| 色婷婷久久久SWAG精品| 久久96国产精品久久久| 97视频久久久| 日本亚洲色大成网站WWW久久| 精品熟女少妇av免费久久| 综合久久精品色| 久久国产乱子伦精品免费午夜| 久久精品国产亚洲AV电影| 亚洲欧洲久久av| 色天使久久综合网天天| 国産精品久久久久久久| 国产精品99久久精品| 亚洲AV无码久久| 一本色道久久99一综合| 久久亚洲AV无码精品色午夜麻豆 | 久久综合国产乱子伦精品免费| 亚州日韩精品专区久久久| 久久久久综合中文字幕| 99久久久久| 精品水蜜桃久久久久久久| 亚洲天堂久久精品| 91精品观看91久久久久久| 久久er热视频在这里精品| 久久91精品国产91久久小草| 蜜桃麻豆www久久| 热99re久久国超精品首页| 91精品国产91久久久久久| 91久久精品无码一区二区毛片|