引用類型參數的初始化及可能出現的問題

引用轉載請註明出處,謝謝!

使用引用類型進行返回值的傳遞經常可以看到,其優點非常明顯,如果引用的是對象,可以減少對象傳遞過程中的對象構造/析構等操作(EffectiveC++ 第三版,第20款),減少CPU資源消耗。但在使用應用的過程中,有些問題也需要注意,下面示例說明。


數據結構:

struct data_header

{

     int type;

     int length;

     ...........

};


方法a:

int  parse_data(void  *rec, char *buffer, int size_buffer,  long long &saved_pos )

{

        saved_pos = 0;

        ............

        if(  xxx )

        {

            saved_pos = pos;

        }

        ...........


        return 0;

}


方法b:

int parse_caller(void *rec, char *buffer, int size_buffer, long long &saved_pos )

{

           ......................

           char  *pcur  = buffer;

           char  *pend =  buffer + size_buffer;


           do

           {

                  int ret = 0;

                  data_header * head = (data_header*)pcur;

                  switch( head->type )

                  {

                         case 0:

                                   break;

                         case 1:

                                   ret =  parse_data(rec, pcur,  pcur-buffer,  save_pos);

                                   break;

                         ..................

                          default:

                                  break; 

                  }


                  if( ret )

                          break;

                  ...................

                  pcur += head->length;

                  ...................

           }while(  pcur < pend );


          return 0;

}


調用過程:

long long save_pos = 0;

int size_buffer = xxxxx;

char *buffer = new char[size_buffer];

...........

for( xxxxxxxx)

{

        save_rec  *rec = new save_rec;

        .................

        if( parse_caller(rec, buffer, size_buffer,  save_pos) )

        {

             log("xxxxxxxxxxxx");

             delete rec;

             delete[] buffer;

             return -1;

        }

         

        if(save_pos > 0 )

        {

            .........................

        }

        .............................

}


整個調用過程看似沒有任何問題,但在這個過程中,對於save_pos的賦值操作,結果卻是不定的,主要是由於在parse_caller的調用中,可能會多次調用parse_data方法,而parse_data的實現中可以看到,每次在進入方法後都會爲save_pos做賦0操作,而只有在某些條件爲真的情況下,纔會進行有效的賦值。因此,多次的parse_data調用可能會導致前一次的有效值被覆蓋。


結論:

對於使用引用類型進行返回值傳遞的方法,對於引用變量,其初始值的設置最好是放在調用方法外面來完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章