程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 引用類型參數的初始化及可能出現的問題

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

編輯:C++入門知識

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

使用引用類型進行返回值的傳遞經常可以看到,其優點非常明顯,如果引用的是對象,可以減少對象傳遞過程中的對象構造/析構等操作(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調用可能會導致前一次的有效值被覆蓋。

 

結論:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved